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 我们使用了 text/html 但它显示为纯 javamail