在以往的web工程中,我们自定义Filter的步骤很简单:
- 定义一个继承自Filter的EncodingFilter类
- 在web.xml的配置如下:
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>com.my.app.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
到此,自定义filter完成
但是,在Spring boot中已经取消了web.xml文件。那么,我们怎么自定义filter呢?
这里有使用注解和非注解两种方式实现方式
注解方式:
- 定义一个继承自Filter的类
- 在自定义类上面添加如下注解
@Order(1) //order表示filter的执行顺序,值越小越靠前
@WebFilter(filterName = "myFilter", urlPatterns = "/*") //urlPatterns 通配符
public class TestFilter implements Filter {
...
}
- 在Application类上面加上@ServletComponentScan注解
到此,自定义filter完成~~~
非注解方式:
- 定义一个MyFilter继承自Filter的类
- 定义一个MvcConfigurations类继承自WebMvcConfigurerAdapter,并加上@Configuration注解
@Configuration
public class MvcConfigurations extends WebMvcConfigurerAdapter {
...
}
- 在MvcConfigurations类中定义一个MyFilter的Bean方法,如下:
@Bean
public MyFilter addFilter() {
return new MyFilter();
}
到此,自定义filter完成~~~
在使用filter的时候,我们可能会遇到这样的问题,一次请求过来filter中的doFilter方法到底执行了几次?
代码如下:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("request");
//todo before request
filterChain.doFilter(servletRequest, servletResponse);
//todo after response
System.out.println("response");
}
问:对于上面的代码,当一次请求过来,输出会是怎样?
网友评论