2017-07-25 109 views
0

我有一个简单的登录过滤器的实现。登录过滤器java servlet

public class LoginFilter implements Filter { 

     @Override 
     public void init(FilterConfig filterConfig) throws ServletException {} 

     @Override 
     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
      HttpServletRequest request = (HttpServletRequest) req; 
      HttpServletResponse response = (HttpServletResponse) res; 

      HttpSession session = request.getSession(false); 
      if (session == null || session.getAttribute("loggedInUser") == null) { 
       response.sendRedirect(request.getContextPath() + "/login.jsp"); 
      } else { 
       chain.doFilter(request, response); 
      } 
     } 

     @Override 
     public void destroy() {} 

    } 

当我去到任何注册页面(即。/account?id=1)无会话属性loggedInUser,过滤器工作正常。它将我重定向到登录页面。 但是,如果我转到不存在的页面(即/blablabla.html),则筛选器会将我重新定向到登录页面。是否有任何方法可以在输入不存在的页面时获得404错误并重定向到/login

回答

2

错误在于要求:过滤所有请求以拒绝对访客进行访问,但仍然希望处理该请求(如果它是404)。这在概念上是错误的:404仍然是应用性响应,它为用户提供了系统内部的视图 - 因此用户必须先获得授权才能知道某些内容是否存在。

另一种选择是分裂您的应用程序在公共和私人区域:

  • /public/style.css
  • /public/app.js
  • ...
  • /private/customer/123
  • /private/oder/8932
  • ...

只在私人区域过滤请求。

注意:如果您关注URL的美感,请考虑/private/前缀不是必需的。过滤器可以以任何前缀可以省略的方式连接

0

请记住过滤器用于过滤所有传入的请求或传出响应,所以实际上流程是这样的。

客户----->申请----> ----过滤>的servlet dispather ---->资源

所以现在,不幸的是,请求将被过滤器无论截获IS该资源是否存在,并且这发生在servlet dispather可以获取请求并意识到该资源不存在之前。

我希望这个解释能回答你的问题。

谢谢。