【问题标题】:How do I implement a dummy filter to exclude a file from being filtered?如何实现虚拟过滤器以排除文件被过滤?
【发布时间】:2010-10-11 07:17:08
【问题描述】:

我正在尝试为除 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); 
  } 
} 

【问题讨论】:

    标签: java servlets servlet-filters


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。我不确定如何不调用 chain.doFilter()。
    • @JustToHelp,干脆不要用这个语句;)
    • @JustToHelp:您已经在粘贴的代码处执行此操作(最后一行代码,在 else 块内)。
    • 如果会话无效,我会尝试将用户重定向到我的登录页面。 if(!session.isNew()){ filterChain.doFilter(request, response); } else{ rd = request.getRequestDispatcher("login.jsp"); rd.forward(请求,响应);问题是如果我使用requestdispatcher,当用户访问login.jsp时会出现死循环。
    • @JustToHelp,所以如果request.getServletPath() 是您的登录页面,请不要调用filterChain.doFilter,这样就不会调用其他过滤器。
    【解决方案2】:

    您不需要新的过滤器。您可以在自己的过滤器中检查它。

    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 路径进行硬编码,这在维护和可移植性方面可能不是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-23
      • 2020-01-06
      • 2011-07-09
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多