为了简洁,单独写一节用于记录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(1);
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(1)
@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);
}
}