1

我在 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 和 .jsf的难题:)

4

2 回答 2

1

理论:

  1. Topics.jsp 需要验证,因此重定向到 LogIn.jsf。

  2. LogIn.jsf 由 FacesServlet 提供服务。但是包含面孔的页面实际上是一个jsp页面。因此 servlet 转发到 LogIn.jsp(构建组件树的页面)。

  3. 在您的过滤器中,路径是 LogIn.jsp 并且您不验证对 LogIn.jsp 的请求,因此您要求进行身份验证并再次重定向到 LogIn.jsf。转到第 2 步。

因此,如果您删除 ,FacesServlet 从 LogIn.jsf 到 LogIn.jsp 的转发不会进入循环。

快速解决方案:将 LogIn.jsp 添加到 if 语句中的路径信息列表中。

于 2011-02-05T09:24:54.633 回答
1

首先,为什么还要在(默认) global 和 all-covering 旁边挂上// forwarddispatchings ?includeerrorrequest

摆脱<dispatcher>过滤器映射中的所有这些行。您不需要它们中的任何一个来进行身份验证过滤器。HTTP 请求是唯一重要的。内部转发/包含/错误调度只能在 HTTP 请求已经到达(并被过滤)时发生。

此外,除了对请求 URI 进行此检查之外,您还可以将过滤器映射到更具体的<url-pattern>类似位置/secured/*,并将所有需要登录的页面放在那里,并将注册和登录页面放在外面。

于 2011-02-07T11:36:14.543 回答