我已经实现了一个过滤器,用于通过检查@SessionScoped
bean的会话来检查用户是否已登录。当我开始测试它时,我注意到每当我访问我的一个页面时,Filter都会被多次调用。
我已经发现我需要忽略AJAX请求,这会减少调用我的过滤器的次数,但每次加载页面时触发的请求数仍然不止一次。
通过反复试验,我发现请求将由以下XHTML标记生成(均嵌入<h:body>
标记中):
<h:outputStylesheet name="styles/userbar.css" target="head"/>
<o:commandScript name="updateMessages" render="custom_messages"/>
第二个标签是OmniFaces库的一部分。
为什么我会收到多个请求或者是否有办法忽略这些标记生成的请求的任何想法?
任何帮助都将不胜感激。
答案 0 :(得分:1)
如果您将过滤器映射到@WebFilter("/*")
之类的通用网址模式,或者直接映射到像@WebFilter(servletNames="facesServlet")
这样的面部servlet上,则会发生这种情况。您所指的请求仅来自(自动包含的)CSS / JS /图像资源。如果您跟踪浏览器的内置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;
}
// ...
}
}