问题代码:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String servletPath = req.getServletPath();
System.out.println("servletPath = " + servletPath); // 测试是否是路径问题
if ("/templates/login.jsp".equals(servletPath)) {
System.out.println(1); // 测试是否是路径问题
filterChain.doFilter(servletRequest, servletResponse);
}
// 放行静态资源 .css .js .jpg
if (servletPath.startsWith("/static")){
//放行请求
filterChain.doFilter(servletRequest, servletResponse);
}
String method = req.getParameter("method");
if ("getCaptcha".equals(method)) {
filterChain.doFilter(servletRequest, servletResponse);
}
if ("login".equals(method)) {
filterChain.doFilter(servletRequest, servletResponse);
}
// 用户登录后放行
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
if (user != null) {
filterChain.doFilter(servletRequest, servletResponse);
}
//重定向到登录页 非法用户
resp.sendRedirect(req.getContextPath() + "/templates/login.jsp");
}
运行结果
servletPath = /templates/login.jsp
1
servletPath = /templates/login.jsp
1
servletPath = /templates/login.jsp
1
servletPath = /templates/login.jsp
1
... ...
问题原因:
重定向后由于if ("/templates/login.jsp".equals(servletPath))
执行后继续向下执行,再次来到resp.sendRedirect(req.getContextPath() + "/templates/login.jsp");
进行重定向进入,导致进入反复跳转的死循环。
解决方法
在每个filterChain.doFilter(servletRequest, servletResponse);
放行后加上return;
,中断程序。
正确代码如下:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String servletPath = req.getServletPath();
if ("/templates/login.jsp".equals(servletPath)) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
// 放行静态资源 .css .js .jpg
if (servletPath.startsWith("/static")){
//放行请求
filterChain.doFilter(servletRequest, servletResponse);
return;
}
String method = req.getParameter("method");
if ("getCaptcha".equals(method)) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
if ("login".equals(method)) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
// 用户登录后放行
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
if (user != null) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
//重定向到登录页 非法用户
resp.sendRedirect(req.getContextPath() + "/templates/login.jsp");
}