开发者社区> 问答> 正文

OncePerRequestFilter有什么作用

OncePerRequestFilter有什么作用,网上搜了一遍都是说
OncePerRequestFilter顾名思义,他能够确保在一次请求只通过一次filter,而不需要重复执行
我对这个一次请求只通过一次filter不是很理解
什么情况下会多次重复执行?

展开
收起
蛮大人123 2016-03-18 15:56:00 5056 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    在spring中,filter都默认继承OncePerRequestFilter,但为什么要这样呢?
    OncePerRequestFilter顾名思义,他能够确保在一次请求只通过一次filter,而不需要重复执行。

    doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)  
                throws ServletException, IOException {  
      
            if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {  
                throw new ServletException("OncePerRequestFilter just supports HTTP requests");  
            }  
            HttpServletRequest httpRequest = (HttpServletRequest) request;  
            HttpServletResponse httpResponse = (HttpServletResponse) response;  
      
            String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName();  
            if (request.getAttribute(alreadyFilteredAttributeName) != null || shouldNotFilter(httpRequest)) {  
                // Proceed without invoking this filter...  
                filterChain.doFilter(request, response);  
            }  
            else {  
                // Do invoke this filter...  
                request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);  
                try {  
                    doFilterInternal(httpRequest, httpResponse, filterChain);  
                }  
                finally {  
                    // Remove the "already filtered" request attribute for this request.  
                    request.removeAttribute(alreadyFilteredAttributeName);  
                }  
            }  
        }  

    大家常识上都认为,一次请求本来就只过一次,为什么还要由此特别限定呢,呵呵实际上我们常识和实际的实现并不真的一样,经过一番查阅后,此方式是为了兼容不同的web Container,特意而为之(jsr168),也就是说并不是所有的container都像我们期望的只过滤一次,servlet版本不同,表现也不同。

    2019-07-17 19:06:54
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多