ajax请求使用拦截器无法跳转页面的问题

开发时一个简单的功能,单点登录验证用户是否登陆,没有登录的情况下跳转到登录页,但是在实际的调试中发现我的拦截跳转一直没起作用,经过百度发现原来是ajax请求下跳转失效了。于是又经过百度怎么解决,最终整理一下。
项目后台使用的是springboot。
先上后台拦截器代码

public class AuthenticationInterceptor implements HandlerInterceptor {
	@Autowired
	JedisPool jedisPool;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		 // TODO Auto-generated method stub
		 try (Jedis jedis = jedisPool.getResource()) {
		 // 判断请求的类型是不是ajax
		 // String type = request.getHeader("X-Requested-With");
		 //token是前台通过请求头传过来的
		 String token = request.getHeader("Access-Token");
		 if (token == null) {
			 if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
				 //告诉ajax我是重定向
				 response.setHeader("REDIRECT", "REDIRECT");
				 //告诉ajax我重定向的路径
				 response.setHeader("CONTENTPATH", "/html/login.html");
				 response.setStatus(HttpServletResponse.SC_FORBIDDEN);
			 }else{
				 response.sendRedirect("/html/login.html");
			 }
			 return false;
		 }
		 //判断redis中有没有相关信息
		 if (!jedis.exists((RedisFlagContast.AUTH_KEY_PREFIX + token).getBytes())) {
			 if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
				 //告诉ajax我是重定向
				 response.setHeader("REDIRECT", "REDIRECT");
				 //告诉ajax我重定向的路径
				 response.setHeader("CONTENTPATH", "/html/login.html");
				 response.setStatus(HttpServletResponse.SC_FORBIDDEN);
			 }else{
				 response.sendRedirect("/html/login.html");
			 }
		 return false;
		 }
		 }
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub

	}

}

以下是前端的代码,找到一个公共的js加入下面的代码

//这里给所有ajax请求添加一个complete函数
$.ajaxSetup({
            complete : function(xhr, status) {
                //拦截器实现超时跳转到登录页面
                // 通过xhr取得响应头
                var REDIRECT = xhr.getResponseHeader("REDIRECT");
                //如果响应头中包含 REDIRECT 则说明是拦截器返回的
                if (REDIRECT == "REDIRECT")
                {
                    var win = window;
                    while (win != win.top)
                    {
                        win = win.top;
                    }
                    //重新跳转到 login.html 
                    win.location.href = xhr.getResponseHeader("CONTEXTPATH");
                }
            }
        });

通过以上的代码调试后发现可以正常执行了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值