登录过滤器java servlet

时间:2017-07-25 14:35:19

标签: java servlets

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

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 个答案:

答案 0 :(得分:2)

该错误在要求中:您过滤所有拒绝访问访客的请求,但仍然希望处理404请求。这在概念上是错误的:404仍然是一个应用程序的响应感觉它给用户一个系统内部的视图 - 所以用户必须先获得授权才能知道某些东西是否存在。

另一个选择是在公共区域和私有区域中拆分您的应用程序:

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

只是过滤私有区域中的请求。

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

答案 1 :(得分:0)

请记住,过滤器可用于过滤任何传入的请求或传出的响应,因此实际上流程就是这样的。

客户----->请求---->过滤器----> servlet dispather ---->资源

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

我希望,这个解释可以回答你的问题。

感谢。