我在web.xml中定义了一个过滤器,如下所示: -
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter>
<display-name>AuthenticationFilter</display-name>
<filter-name>AuthenticationFilter</filter-name>
<filter-class>com.filters.AuthenticationFilter</filter-class>
</filter>
并在过滤器中我有以下代码: -
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse hres = (HttpServletResponse) response;
String pathInfo = httpRequest.getRequestURI().trim();
System.out.println(pathInfo);
// Do not process any non-jsp files or LogIn.jsp ! pathInfo.endsWith("jsf") ||
if (pathInfo.endsWith("RegistrationForm.jsf") || pathInfo.endsWith("Login.jsf")) {
chain.doFilter(request, response);
return;
}
// pass the request along the filter chain
User user = (User) httpRequest.getSession().getAttribute("USER_IN_SESSION");
if(user==null)
hres.sendRedirect("Login.jsf");
else {
chain.doFilter(request, response);
}
}
问题是,如果我使用Topic.jsp调用应用程序,它会像这样循环: -
Topic.jsp
LogIn.jsf
Login.jsp
Login.jsf
Login.jsp
...
我发现问题是映射中的FORWARD。如果删除此条目,则可以使用
<dispatcher>FORWARD</dispatcher>
请帮助我解决无限循环交替 .jsp&amp;的这个幻想.jsf :)
答案 0 :(得分:1)
理论值:
Topics.jsp需要验证,所以a 重定向到LogIn.jsf。
LogIn.jsf由。提供 FacesServlet的。但页面是 包含面孔真的是一个jsp 页。所以servlet是一个前锋 到LogIn.jsp(构建它的页面) 组件树)。
在您的过滤器中,路径为LogIn.jsp,您不验证 请求LogIn.jsp,所以你要求 身份验证和重定向到 LogIn.jsf再次生成。转到第2步。
因此,如果删除,则将FacesServlet从LogIn.jsf转发到LogIn.jsp不会进入循环。
快速解决方案:将LogIn.jsp添加到if语句中的路径信息列表中。
答案 1 :(得分:1)
首先,为什么你想要挂钩forward
/ include
/ error
派遣以及(默认)全局和所有 - 覆盖request
?
删除过滤器映射中的所有<dispatcher>
行。您不需要其中任何一个用于身份验证筛选器。 HTTP请求是唯一重要的。内部转发/包含/错误分派只能在HTTP请求到达(并过滤)时发生。
此外,您还可以将请求URI映射到更具体的<url-pattern>
{@ 1}}上,而不是对请求URI进行检查,并将所有需要登录的页面放在那里并放置在外面注册和登录页面。