JSF2.0每页生成多个请求
我实现了一个过滤器,通过检查会话中的JSF2.0每页生成多个请求,jsf,servlets,jsf-2,servlet-filters,Jsf,Servlets,Jsf 2,Servlet Filters,我实现了一个过滤器,通过检查会话中的@SessionScopedbean来检查用户是否登录。然而,当我开始测试它时,我注意到每当我访问我的一个页面时,过滤器都会被多次调用 我发现我需要忽略AJAX请求,这减少了我的过滤器被调用的次数,但每次加载页面时触发的请求数量仍然不止一个 通过反复试验,我发现请求将由以下XHTML标记生成(均嵌入标记中): 第二个标记是OmniFaces库的一部分 你知道为什么我会收到多个请求,或者是否有办法忽略这些标签生成的请求吗 如果您将过滤器映射到像@WebFil
@SessionScoped
bean来检查用户是否登录。然而,当我开始测试它时,我注意到每当我访问我的一个页面时,过滤器都会被多次调用
我发现我需要忽略AJAX请求,这减少了我的过滤器被调用的次数,但每次加载页面时触发的请求数量仍然不止一个
通过反复试验,我发现请求将由以下XHTML标记生成(均嵌入
标记中):
第二个标记是OmniFaces库的一部分
你知道为什么我会收到多个请求,或者是否有办法忽略这些标签生成的请求吗
如果您将过滤器映射到像
@WebFilter(“/*”
)这样的通用URL模式上,或者直接映射到像@WebFilter(servletNames=“facesServlet”)
这样的faces servlet上,我们将不胜感激。。您所指的请求只是来自(自动包含的)CSS/JS/image资源。如果您跟踪浏览器的内置HTTP流量监视器(按F12,网络)或在筛选器中调试请求URI,那么这应该很快变得清晰
至于覆盖JSF资源请求,如果出于某种原因,不可能将过滤器更改为侦听更具体的URL模式,如@WebFilter(“/app/*”)
,那么您需要在请求URI上添加额外的检查。如果您使用的是OmniFaces,则可以使用来检入过滤器,以确定当前请求是JSF ajax请求还是JSF资源请求:
@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;
}
// ...
}
}
另见:
- (对于不使用OmniFaces的情况,包含一个“普通”Servlet示例)
@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;
}
// ...
}
}