ajaxsetup无效_$.ajax 请求 拦截器 重定向 无效 解决办法

在ajax 异步请求下 拦截器过滤器中使用 重定向 页面响应无效

我这里用的是springboot框架,用拦截器实现 对请求的拦截 ,session超时直接跳转到login.html页面。

后台代码:

@Override public void addInterceptors(InterceptorRegistry registry) { //加载自定义拦截器(登录请求和退出请求放行) registry.addInterceptor(new DemoIntercept()).addPathPatterns("/**").excludePathPatterns("/loginController","/logout"); } /** *自定义拦截器 **/ public class DemoIntercept implements HandlerInterceptor { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) throws Exception { logger.info("afterCompletion:{}", request.getRequestURI()); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3) throws Exception { logger.info("postHandle:{}", request.getRequestURI()); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { //获取session HttpSession session = request.getSession(); Object username = session.getAttribute("username"); //用户如果为null 则 重定向到 login页面 ,否则放行 if(null == username) { //重定向到login.html redirect(request, response); return false; } return true; } //对于请求是ajax请求重定向问题的处理方法 public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException{ //获取当前请求的路径 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath(); //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理 否则直接重定向就可以了 if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){ //告诉ajax我是重定向 response.setHeader("REDIRECT", "REDIRECT"); //告诉ajax我重定向的路径 response.setHeader("CONTENTPATH", basePath+"/login.html"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); }else{ response.sendRedirect(basePath + "/login.html"); } } } 

前台代码

//这里给所有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"); } } });

这里实现的原理也就是,后台在ajax请求头上打上标记 (REDIRECT ),标记(REDIRECT )这个请求要重定向,而前台接受到响应后 根据标记(REDIRECT )判断这个响应头是否需要 重定向 如果需要则 则获取重定向地址 就可以了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值