在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 )判断这个响应头是否需要 重定向 如果需要则 则获取重定向地址 就可以了

随机推荐

  1. windows下使用cpanm进行模块安装

    windows下使用cpanm进行模块安装 要放假了,突然想整理一下手头上的软件,突然发现perl的安装模块这个功能不能用. 弄了一下,使得windows 下 perl 的 cpanm能用,避免成天为 ...

  2. 1.1 Introduction中 Kafka as a Messaging System官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka as a Messaging System kafka作为一个消息系统 ...

  3. “焦点图/幻灯片”“Tab标签切换”“图片滚动”“无缝滚动”仅需一个SuperSlidev2.1

    官网:http://www.superslide2.com/index.html 1. 标签切换 / 书签切换 / 默认效果 2. 焦点图 / 幻灯片 3. 图片滚动-左 4. 图片滚动-上 5. 图 ...

  4. 推荐一款优雅高效的免费在线APP原型工具

    有段时间没有推荐干货给大伙了,今天是时候把压箱底的东西拿出来分享给大家了! 想要学习原型图绘制的小伙伴可以看过来,适合零基础的小白,五分钟就可以上手,绘制自己想要的产品原型图. 官方介绍:用户只需输入 ...

  5. crm2013 查看下拉框的选项

    在CRM2011中,我们非常easy查看下拉框的选择.打开页面,按F12.把光标对准目标,就会显示出详细的选项,如图:' watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...

  6. 修改IIS7并发连接数目限制

    转自原文 修改IIS7并发连接数目限制 1. 调整IIS 7应用程序池队列长度 由原来的默认1000改为65535. IIS Manager > ApplicationPools > Ad ...

  7. [Android5.1]ActivityManagerService启动过程分析

    ActivityManagerService(简称AMS)是Android系统的关键服务之中的一个.它的主要作用例如以下: 管理系统中全部应用进程的整个生命周期 管理应用进程中的Activity.Se ...

  8. Scala入门到精通——第十九节 隐式转换与隐式參数(二)

    作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...

  9. php gettext方式实现UTF-8国际化多语言(i18n)

    php gettext方式实现UTF-8国际化多语言(i18n) 一.总结 一句话总结: 二.php gettext方式实现UTF-8国际化多语言(i18n) 近 来随着i18n(国际化)的逐渐标准化 ...

  10. 多类 SVM 的损失函数及其梯度计算

    CS231n Convolutional Neural Networks for Visual Recognition -- optimization 1. 多类 SVM 的损失函数(Multicla ...