结论
- 加return关键字可以使过滤器中的转发&重定向提交
问题复现
现象1【转发】
过滤器代码
@WebFilter(urlPatterns= {"/aaa"})
public class testFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request1 =(HttpServletRequest) request;
HttpServletResponse response1 =(HttpServletResponse) response;
System.out.println("111111111666666666666666666666666666666666");
request1.getRequestDispatcher("index").forward(request1,response1);//正确的写法=》前缀+index+后缀=》/templates/index.html
System.out.println("11111111177777777777777777777777777777777777");
System.out.println("111111111222222222222222222222");
chain.doFilter(request1, response1);
System.out.println("1111111113333333333333333333333");
}
}
结果
-
页面正常转发,但是控制台报错
-
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
-
chain.doFilter之后的代码不会被执行
执行完 chain.doFilter之后,过滤器放行
解决方案
- 在转发后面添加return,但是return之后,不能再添加其他代码,不然会编译报错
- 可以使用if-else格式处理return
@WebFilter(urlPatterns= {"/aaa"})
public class testFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request1 =(HttpServletRequest) request;
HttpServletResponse response1 =(HttpServletResponse) response;
System.out.println("111111111666666666666666666666666666666666");
request1.getRequestDispatcher("index").forward(request1,response1);//正确的写法=》前缀+index+后缀=》/templates/index.html
System.out.println("11111111177777777777777777777777777777777777");
return;
}
}
现象2【重定向】
过滤器代码
@WebFilter(urlPatterns= {"/aaa"})
public class testFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request1 =(HttpServletRequest) request;
HttpServletResponse response1 =(HttpServletResponse) response;
System.out.println("1111111114444444444444444444444444");
response1.sendRedirect("/user/showLogin");
System.out.println("1111111115555555555555555555555555555");
System.out.println("111111111222222222222222222222");
chain.doFilter(request1, response1);
System.out.println("1111111113333333333333333333333");
}
}
结果
- 页面不能正常重定向
- java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
解决方案
- 加return
@WebFilter(urlPatterns= {"/aaa"})
public class testFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request1 =(HttpServletRequest) request;
HttpServletResponse response1 =(HttpServletResponse) response;
System.out.println("1111111114444444444444444444444444");
response1.sendRedirect("/user/showLogin");
return;//添加return之后就可以重定向了(相当于flush提交)
}
}