真的不敢相信!过滤器不拦截login.jsp页面,而且“return”,但其实还会往下执行吧?!
【我的代码】
web.xml配置的过滤器<url-pattern>/*</url-pattern>,然后过滤器doFilter方法写法如下:
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException{ HttpServletRequest request = (HttpServletRequest)arg0; HttpServletResponse response = (HttpServletResponse)arg1; if(request.getRequestURL().indexOf("login") != -1){ System.out.println("访问的url带‘login’...");//------------- chain.doFilter(request, response); return; } System.out.println("不是return了吗,还继续?!");//--------------- String account = (String)request.getSession().getAttribute("account"); if(account != null){ chain.doFilter(request, response); }else{ System.out.println("before redirect");//--------- response.sendRedirect("login.jsp"); System.out.println("执行重定向了,这样一来不是会死循环吗?!");//--------- } }
【执行结果】
login.jsp可以成功打开,不会提示有过多重定向。(没有对含有login的URL进行放行时,在有些浏览器打开login.jsp页面会提示过多重定向,即死循环)。
而且控制台显示如下
【问题】
1)为什么return之后的输出语句还会执行?
2)如果return之后的输出语句还会执行是因为过滤器如下的工作原理:
即访问到Web资源后还会“返回”继续执行chain.doFilter(request,response)之后的代码的话,那么return在这里又起到了什么作用?
3)从控制台结果我们可以看出response.sendRedirect("login.jsp")之后的输出语句被执行,这就意味着执行了重定向,这样一来,按道理不是又会陷入死循环吗?
4)为什么chain.doFilter(request,respones)之后的print语句内容反倒优先输出?“访问的url带‘login’”反倒在最后输出?