sprnate
2015-12-10 16:42
【我的代码】
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’”反倒在最后输出?
单就楼主的这份代码而言,我在我本机上跑了一下,是完全没有问题的。

所以楼主的问题不在这里。要么是web.xml注册Filter的时候出了问题,要么就是一开始请求的那个页面出了问题。建议你在判断request.getRequestURL()之前先打印下这个你获取到的URL,看是不是含有login。你后面Redirect("login.jsp"),该url肯定含有login,所以进入if体后遇到return自然没有往下执行。
对于你的几个问题:
只要语句执行到return,必然结束,没有第二种可能,如果和你的语气不符,肯定是你的问题。
对于这个问题,在回答1的背景下,并不成立。
因为你重定向的就是“login.jsp”所以IndexOf()肯定会检测出来,进入if语句,遇到return就结束了。
参考回答1、2
都是大神啊。膜拜了!!!!!
Java Web开发技术应用——过滤器
70482 学习 · 266 问题
相似问题