大家都知道Filter是过滤器,在一定的场景下会用到,但是你知道OncePerRequestFilter与Filter的区别么?为什么我们一般用OncePerRequestFilter而不用Filter ? 今天带着两个疑问进行下面的浏览。
一 过滤器的作用
过滤器可以再请求和响应之前做一部分预处理,有效的过滤掉不需要的内容,而且过滤器可以被复用,节省了大量的复用代码,提高了java的代码执行效率。
二 过滤器的应用场景
三 为什么用 OncePerRequestFilter
Spring的OncePerRequestFilter类实际上是一个实现了Filter接口的抽象类。spring对Filter进行了一些封装处理。OncePerRequestFilter是在一次外部请求中只过滤一次。对于服务器内部之间的forward等请求,不会再次执行过滤方法。实现Filter接口,也会在一次请求中只过滤一次, 实际上,OncePerRequestFilter是为了兼容不同的web 容器,也就是说其实不是所有的容器都过滤一次。Servlet版本不同,执行的过程也不同。例如:在Servlet2.3中,Filter会过滤一切请求,包括服务器内部使用forward和<%@ include file=/login.jsp%>的情况,但是在servlet2.4中,Filter默认只会过滤外部请求。
四 总结
OncePerRequestFilter与Filter 没有什么很大的区别,只是为了过滤请求从而实现特定的业务。需注意Servlet2.3版本的 Filter可以过滤所有请求。
建议使用 OncePerRequestFilter。是一个比较稳妥的选择。
多个过滤器可以使用
@Component+@Order()
来保证执行顺序。代码如下
@Component@Order(1)@Slf4jpublic class FirstFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) servletRequest;log.info("Starting a transaction for req : {}",req.getRequestURI());filterChain.doFilter(servletRequest, servletResponse);log.info("Committing a transaction for req : {}",req.getRequestURI());}}@Component@Order(2)@Slf4jpublic class SecondFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) servletRequest;log.info("Starting a transaction for req : {}",req.getRequestURI());filterChain.doFilter(servletRequest, servletResponse);log.info("Committing a transaction for req : {}",req.getRequestURI());}}
文章转载自全栈的程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




