JSF 2.0 每页生成多个请求

JSF 2.0 Multiple requests generated per page

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

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

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

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

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

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

如有任何帮助,我们将不胜感激。

如果您将过滤器映射到通用 URL 模式(如 @WebFilter("/*"))或直接映射到面部 servlet(如 @WebFilter(servletNames="facesServlet")),就会发生这种情况。您所指的请求仅来自(自动包含的)CSS/JS/image 资源。如果您跟踪浏览器的内置 HTTP 流量监视器(按 F12,网络)或在过滤器中调试请求 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(包含一个 "plain vanilla" Servlet 示例,适用于您未使用 OmniFaces 的情况)