真的不敢相信!过滤器不拦截login.jsp页面,而且“return”,但其实还会往下执行吧?!

来源:6-1 登录案例

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页面会提示过多重定向,即死循环)。

而且控制台显示如下

http://img.mukewang.com/5669385f0001544306810190.jpg

【问题】

1)为什么return之后的输出语句还会执行?

2)如果return之后的输出语句还会执行是因为过滤器如下的工作原理:

http://img.mukewang.com/566939ea0001cd3712800720.jpg

即访问到Web资源后还会“返回”继续执行chain.doFilter(request,response)之后的代码的话,那么return在这里又起到了什么作用?

3)从控制台结果我们可以看出response.sendRedirect("login.jsp")之后的输出语句被执行,这就意味着执行了重定向,这样一来,按道理不是又会陷入死循环吗?

4)为什么chain.doFilter(request,respones)之后的print语句内容反倒优先输出?“访问的url带‘login’”反倒在最后输出?

写回答 关注

2回答

  • sxian_wang
    2015-12-10 20:51:59
    已采纳

    单就楼主的这份代码而言,我在我本机上跑了一下,是完全没有问题的。

    http://img.mukewang.com/566973ef00014c5c18720700.jpg

    所以楼主的问题不在这里。要么是web.xml注册Filter的时候出了问题,要么就是一开始请求的那个页面出了问题。建议你在判断request.getRequestURL()之前先打印下这个你获取到的URL,看是不是含有login。你后面Redirect("login.jsp"),该url肯定含有login,所以进入if体后遇到return自然没有往下执行。

    对于你的几个问题:

    1. 只要语句执行到return,必然结束,没有第二种可能,如果和你的语气不符,肯定是你的问题。

    2. 对于这个问题,在回答1的背景下,并不成立。

    3. 因为你重定向的就是“login.jsp”所以IndexOf()肯定会检测出来,进入if语句,遇到return就结束了。

    4. 参考回答1、2

    sxian_... 回复sprnat...

    哈哈~加油~

    2015-12-12 12:51:11

    共 2 条回复 >

  • 激流勇进__
    2016-01-30 11:25:55

    都是大神啊。膜拜了!!!!!

Java Web开发技术应用——过滤器

本课程主要是从实际生活当中的过滤器入手,详细讲解了Java Web过滤器

70482 学习 · 266 问题

查看课程

相似问题