如何实现虚拟过滤器以排除文件被过滤?

时间:2010-10-11 07:17:08

标签: java servlets servlet-filters

我正在尝试为除login.jsp之外的所有文件实现过滤器。据我所知,过滤器映射不能排除某些文件。我需要做的是创建另一个过滤器来映射login.jsp。如何使用url模式/login.jsp创建另一个文件并且之后不处理SessionFilter? 以下是我所有文件的会话过滤器代码的一部分。

public class SessionFilter implements Filter{ 
   RequestDispatcher rd = null; 

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 
   throws IOException, ServletException{ 
      HttpServletRequest request = (HttpServletRequest)request; 
      HttpSession session = request.getSession(); 

   // New Session so forward to login.jsp 
   if (session.isNew()){ 
     rd = request.getRequestDispatcher("login.jsp"); 
     rd.forward(request, response); 
  } 

  // Not a new session so continue to the requested resource 
   else{ 
      filterChain.doFilter(request, response); 
  } 
} 

2 个答案:

答案 0 :(得分:2)

您可以使用request.getServletPath()检查所请求的路径是否在“排除列表”中。

如果您想要一个与Filter分开的新SessionFilter,您可以将特殊标志设置为请求属性(例如“loginPage”),该标志将由其他过滤器检查(如果您需要与Filter分隔的新SessionFilter或您无法调用chain.doFilter()

如果您要修改SessionFilter,请不要重新发送到“login.jsp”

答案 1 :(得分:1)

您不需要新的过滤器。你可以在你自己的过滤器上查看它。

if(request.getServletPath().equals("login.jsp") || !session.isNew()) { // or "/login.jsp", not sure about this
   filterChain.doFilter(request, response); 
} else { // session is new and it's not login.jsp
     rd = request.getRequestDispatcher("login.jsp"); 
     rd.forward(request, response);    
}

但我不喜欢这种做法。它似乎重写了servlet的JAAS API。它意味着硬编码jsp路径,这可能不是维护和可移植性的好主意。