為了簡潔,單獨寫一節用于記錄filter。
啟動spring boot項目時,在日志中可以看到如下資訊:
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
上面顯示的資訊是預設過濾器的配置。
看出spring boot預設的filter設定了預設的四個filter:characterEncodingFilter,hiddenHttpMethodFilter,httpPutFormContentFilter,requestContextFilter。
那麼問題來了,如果想配置自定義的filter該怎麼做?
具體代碼如下:
通過配置來生成bean
@Configuration
public class WebConfiguration {
@Bean //用于添加自定義的filter,并設定初始參數
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("MyFilter");
registration.setOrder();
return registration;
}
public class MyFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) srequest;
System.out.println("this is MyFilter,url :"+request.getRequestURI());
filterChain.doFilter(srequest, sresponse);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
}
隻需要想上述一樣,定義一個配置檔案,并為filter注入bean就行了。
通過注解生成filter
另一種通過全配置的方法如下:
@Order()
@WebFilter(filterName = "testFilter1",
urlPatterns = "/*",
initParams ={@WebInitParam(name="name", value="filter")})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("TestFilter1:after");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {}
}
通過該種注解的方式配置filter,需要先啟用@ServletComponentScan配置。
@SpringBootApplication(scanBasePackages = "xxx.xxx.client.*")
@ServletComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}