JSF 2.0 每页生成多个请求

Posted

技术标签:

【中文标题】JSF 2.0 每页生成多个请求【英文标题】:JSF 2.0 Multiple requests generated per page 【发布时间】: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 库的一部分。

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

任何帮助将不胜感激。

【问题讨论】:

【参考方案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;
        

        // ...
    


另见:

Authorization redirect on session expiration does not work on submitting a JSF form, page stays the same(包含一个“普通的”Servlet 示例,适用于您不使用 OmniFaces 的情况)

【讨论】:

非常感谢!检查请求是否是资源请求解决了问题!

以上是关于JSF 2.0 每页生成多个请求的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0 应用程序的水平缩放

JSF 2.0 和多次提交问题

jsf 2.0 我们使用了 text/html 但它显示为纯 javamail

JSF 2.0。无法在 preRenderView 事件处理程序中获取 POST 参数和 cookie

JSF 2.0:跨多个视图保留组件状态

为啥单页应用程序通常必须在每页发出更多请求时更快?