使用@WebFilter注解时有个坑往往注意不到
根据@WebFilter注解的源码注释可以知道,只需要用写一个类去实现filter,然后给类加上@WebFilter注解,就可以了,不管用的话回想是不是没代理成功,再给类加个@Component注解,测试一下,成功拦截了。
@Component //这个记得去掉~
@WebFilter(filterName = "testFilter", urlPatterns = {"/addCommOnFlowAlarmP"})
public class testFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
}
@Override
public void destroy() {
}
}
但是实际上,真的结束了吗?
并没有,通过测试发现,不管在@WebFilter的urlPatterns参数中如何配置,还是所有请求都会拦截,为什么,因为@WebFilter根本就没有生效。
既然没有生效,那么Filter为什么能拦截呢?
因为这个类实现了Filter,而且还被@Component扫描生成了bean,当然会生成一个默认的全局拦截器啊!
当然,如果愿意在doFilter里进行判断,也不是不能用- -!
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
if("/home/addCommOnFlowAlarmP".equals(((HttpServletRequest) request).getRequestURI())){
// TODO
}else {
chain.doFilter(request, response);
}
}
但是重点不在这,要用@WebFilter(urlPatterns)来配置过滤规则嘛!
只需要在启动类上加一个注解@ServletComponentScan就解决啦~
不过要记得把@Component注解去掉,不然就会有两个过滤器了!不信可以试试,一个请求会进来两次~