11月21日 周三 一个错误的拦截器

本文深入探讨了SessionInterceptor在Spring MVC框架中的实现原理,详细分析了如何通过拦截器检查用户Session状态,防止未登录用户访问受保护资源。同时,揭示了错误代码中可能引发的死循环重定向问题,并提供了修改建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一段正确的代码

public class SessionInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(request.getRequestURI());
		if(request.getRequestURI().equals("/login")) {
			return true;
		}
		
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("user");
		if(null==user) {
			response.sendRedirect("/login");
			return false;
		}
		return true;
	}
}	

错误代码

public class SessionInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(request.getRequestURI());
		
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("user");
		if(null != user) {
			return true;
		} else {
			response.sendRedirect("/login");
			PrintWriter printWriter = response.getWriter();  
            printWriter.write("{code:0,message:\"session is invalid,please login again!\"}");  
            return false;
		}
		return true;死代码
	}
}

错误代码 死循环,一直重定向

public class SessionInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(request.getRequestURI());
		
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("user");
		if(null != user) {
			return true;
		}
		else {
			response.sendRedirect("/login");
           		 return false;
		}
	}
}

错误代码分析原因
当进入拦截器后判断Session中User是否存在,第一次访问时User是不存在的所以在错误代码中只会访问else判断体就会重定向到/login,并且返回false,既然重定向了,就会再次进入拦截器当中,此时User依然不存在,所以再次进入else判断体,如此形成死循环,找不到出口。

手越用越巧,脑越用越灵,至水到渠成,得奥妙精髓… ​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值