我有一个简单的登录过滤器实现。
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
存在?
答案 0 :(得分:2)
该错误在要求中:您过滤所有拒绝访问访客的请求,但仍然希望处理404请求。这在概念上是错误的:404仍然是一个应用程序的响应感觉它给用户一个系统内部的视图 - 所以用户必须先获得授权才能知道某些东西是否存在。
另一个选择是在公共区域和私有区域中拆分您的应用程序:
/public/style.css
/public/app.js
/private/customer/123
/private/oder/8932
只是过滤私有区域中的请求。
注意:如果您担心URL的美感,请考虑/private/
前缀不是必需的。过滤器的连接方式可以省略任何前缀
答案 1 :(得分:0)
请记住,过滤器可用于过滤任何传入的请求或传出的响应,因此实际上流程就是这样的。
客户----->请求---->过滤器----> servlet dispather ---->资源
所以现在,不幸的是,无论资源是否存在,请求都会被过滤器截获,这发生在servlet dispather获取请求并意识到资源不存在之前。
我希望,这个解释可以回答你的问题。
感谢。