Filter介紹
Filter是Servlet規范規定的,不屬於spring框架,也是用於請求的攔截。但是它適合更粗粒度的攔截,在請求前后做一些編解碼處理、日志記錄等。
一個Filter包括:
1)、在servlet被調用之前截獲;
2)、在servlet被調用之前檢查servlet request;
3)、根據需要修改request頭和request數據;
4)、根據需要修改response頭和response數據;
5)、在servlet被調用之后截獲
實現方式
一、基於注解方式
1.編寫自己的filter
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; /** * 自定義過濾器 * @ClassName: CustomFilter * @Description: 過濾器,顧名思義,能夠過濾一切請求(而攔截器只能過濾action請求),包括靜態資源的請求。 * chain.doFilter(request, response)表示過濾通過,能夠往下執行。 * 所以過濾操作要寫在chain.doFilter(request, response) 前面,作一些條件判斷; * 如果不符合條件,則不執行chain.doFilter(request, response); * @author OnlyMate * @Date 2018年8月28日 下午3:04:44 * */ @Order(1)//定義優先級 @WebFilter(filterName="CustomFilter",urlPatterns="/*") public class CustomFilter implements Filter{ private Logger logger = LoggerFactory.getLogger(CustomFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { logger.info("CustomFilter ==> init method: init"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { logger.info("CustomFilter ==> doFilter method: before"); chain.doFilter(request, response);//執行請求 logger.info("CustomFilter ==> doFilter method: after"); } @Override public void destroy() { logger.info("CustomFilter ==> destroy method: destroy"); } }
2.配置
在項目的啟動入口上加上@ServletComponentScan注解,開啟掃描所有的servlet組件
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) //使用 @EnableWebMvc 注解,需要以編程的方式指定視圖文件相關配置; //@EnableWebMvc //使用 @EnableAutoConfiguration 注解,會讀取 application.properties 或 application.yml 文件中的配置 @EnableAutoConfiguration @ServletComponentScan//springboot啟動類掃描servlet組件(過濾器) public class Application { public static ApplicationContext applicationContext; private static final Logger logger = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { startApplication(args); } public static ApplicationContext startApplication(String[] args) { if (applicationContext == null) { logger.info(" >>> Springboot Application 開始啟動..."); SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class); SpringApplication application = builder.application(); Set<String> sources = new HashSet<>(); sources.add("classpath:applicationContext.xml"); application.setSources(sources); applicationContext = application.run(args); logger.info(" >>> Springboot Application 啟動完成!"); } return applicationContext; } public static ApplicationContext getApplicationContext() { if (applicationContext == null) { logger.error(" >>> Error:Springboot Application ApplicationContext is Null."); } return applicationContext; } }
二、基於Java配置
1.編寫自己的filter
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 自定義過濾器 * @ClassName: CustomPlainFilter * @Description: 過濾器,顧名思義,能夠過濾一切請求(而攔截器只能過濾action請求),包括靜態資源的請求。 * chain.doFilter(request, response)表示過濾通過,能夠往下執行。 * 所以過濾操作要寫在chain.doFilter(request, response) 前面,作一些條件判斷; * 如果不符合條件,則不執行chain.doFilter(request, response); * @author OnlyMate * @Date 2018年8月28日 下午3:04:44 * */ public class CustomPlainFilter implements Filter{ private Logger logger = LoggerFactory.getLogger(CustomPlainFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { logger.info("CustomPlainFilter ==> init method: init"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { logger.info("CustomPlainFilter ==> doFilter method: before"); chain.doFilter(request, response);//執行請求 logger.info("CustomPlainFilter ==> doFilter method: after"); } @Override public void destroy() { logger.info("CustomPlainFilter ==> destroy method: destroy"); } }
2.配置
自定義一個配置類
這里的配置有兩種方式,第一種是通過動態代理去找"customPlainFilter"對應的實體bean,第二種方式是直接注入自定義的filter(CustomFilterConfigurer)
/** * 自定義一個配置類 * @ClassName: CustomFilterConfigurer * @Description: TODO * @author OnlyMate * @Date 2018年8月31日 下午3:25:51 * */ @Configuration public class CustomFilterConfigurer { @Bean public FilterRegistrationBean<DelegatingFilterProxy> testFilterRegistration() { FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<DelegatingFilterProxy>(); //第一種方式,使用動態代理的方式 registration.setFilter(new DelegatingFilterProxy("customPlainFilter")); //第二種方式,直接注入一個filter // registration.setFilter(new CustomPlainFilter()); // registration.setName("customPlainFilter"); registration.addUrlPatterns("/*"); registration.addInitParameter("paramName", "paramValue"); registration.setEnabled(true); registration.setDispatcherTypes(DispatcherType.REQUEST); registration.setOrder(1); return registration; } @Bean(name="customPlainFilter") public CustomPlainFilter createCustomPlainFilter() { return new CustomPlainFilter(); } }
效果圖
總結
Spring Boot實現一個過濾器與傳統的方式差別很大,有想了解的可以看之前轉載別人的一篇
Spring boot下添加filter