为了账号安全,请及时绑定邮箱和手机立即绑定

真的不敢相信!过滤器不拦截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页面会提示过多重定向,即死循环)。

而且控制台显示如下

http://img1.sycdn.imooc.com//5669385f0001544306810190.jpg

【问题】

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

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

http://img1.sycdn.imooc.com//566939ea0001cd3712800720.jpg

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

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

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

正在回答

2 回答

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

http://img1.sycdn.imooc.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

2 回复 有任何疑惑可以回复我~
#1

sprnate 提问者

额……好吧,我服了我自己。我在web.xml里面配置了<welcome-file>login.jsp</welcome-file>,然后我一直都是直接访问项目名-_-|||。这也很好地解释了为什么我的控制台结果是那样的。因为我配置的过滤器<url-pattern>/*</url-pattern>,即拦截了所有,所以访问项目名时就已经“触发”了一次项目名,之后再跳转到login.jsp页面的.... 谢谢了,一时糊涂,请勿拍砖,哈哈。
2015-12-11 回复 有任何疑惑可以回复我~
#2

sxian_wang 回复 sprnate 提问者

哈哈~加油~
2015-12-12 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信