【问题标题】:JSF 2.0 Multiple requests generated per pageJSF 2.0 每页生成多个请求
【发布时间】:2015-05-26 09:44:35
【问题描述】:

我实现了一个过滤器,通过检查会话中的@SessionScoped bean 来检查用户是否登录。然而,当我开始测试它时,我注意到每当我访问我的一个页面时,都会多次调用过滤器。

我发现我需要忽略 AJAX 请求,这减少了我的过滤器被调用的次数,但每次加载页面时触发的请求数仍然不止一个。

通过反复试验,我发现请求将由以下 XHTML 标记生成(均嵌入在 <h:body> 标记中):

<h:outputStylesheet name="styles/userbar.css" target="head"/>
<o:commandScript name="updateMessages" render="custom_messages"/>

第二个标签是 OmniFaces 库的一部分。

知道为什么我会收到多个请求,或者是否有办法忽略这些标签生成的请求?

任何帮助将不胜感激。

【问题讨论】:

    标签: jsf servlets jsf-2 servlet-filters


    【解决方案1】:

    如果您将过滤器映射到通用 URL 模式(如 @WebFilter("/*"))或直接映射到面孔 servlet(如 @WebFilter(servletNames="facesServlet")),则可能会发生这种情况。您所指的请求只是来自(自动包含的)CSS/JS/图像资源。如果您跟踪浏览器的内置 HTTP 流量监视器(按 F12,Network)或在过滤器中调试请求 URI,那么应该很快就会清楚。

    关于覆盖 JSF 资源请求,如果由于某种原因无法更改过滤器以侦听更具体的 URL 模式(如 @WebFilter("/app/*")),那么您需要对请求 URI 添加额外的检查。鉴于您使用的是 OmniFaces,如果当前请求是 JSF ajax 请求还是 JSF 资源请求,您可以使用 Servlets utility class 来检查过滤器:

    @WebFilter("/*")
    public class YourFilter extends HttpFilter {
    
        @Override
        public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws IOException, ServletException {
            if (Servlets.isFacesAjaxRequest(request) || Servlets.isFacesResourceRequest(request)) {
                chain.doFilter(request, response);
                return;
            }
    
            // ...
        }
    
    }
    

    另见:

    【讨论】:

    • 非常感谢!检查请求是否是资源请求解决了问题!
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多