在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. mysql-5.7.19-winx64服务无法启动解决方案

    解压mysql压缩包时没有data文件夹,不要手动创建,在cmd下直接运行命令: mysqld –initialize-insecure,data文件夹会自动生成,注意单词千万不要拼错,不要写成–in ...

  2. win7打不开chm格式文件

           近期在开发的过程中,发现重装的系统Wind7 打不开java帮助文档.搜索了半天才找到. 在这里分享一下. 一.假设不能打开,可这样恢复文件关联: 1.開始执行,输入:regsvr32 ...

  3. 忍者无敌-实例解说Cocos2d-x瓦片地图

    实例比較简单,如图所看到的,地图上有一个忍者精灵,玩家点击他周围的上.下.左.右,他能够向这个方向行走. 当他遇到障碍物后是无法穿越的,障碍物是除了草地以为部分,包含了:树.山.河流等. 忍者实例地图 ...

  4. POJ 1862 Stripies 贪心+优先队列

    http://poj.org/problem?id=1862 题目大意: 有一种生物能两两合并,合并之前的重量分别为m1和m2,合并之后变为2*sqrt(m1*m2),现在给定n个这样的生物,求合并成 ...

  5. 微信浏览器跳转外部浏览器 app下载

    这个是摘抄的,具体抄的哪里我忘记了,作为记录 2019年5月14日 现在这个好像也不好用了,微信又提示建议下载qq浏览器什么的,显示一个红色感叹号,让用户产生怀疑,很鄙视tx error_report ...

  6. REGEXP_LIKE,REGEXP_INSTR,REGEXP_SUBSTR,REGEXP_REPLACE

    参考: http://www.cnblogs.com/scottckt/archive/2012/10/11/2719562.html http://www.jb51.net/article/3842 ...

  7. POJ 3259 Wormholes 邻接表的SPFA判断负权回路

    http://poj.org/problem?id=3259 题目大意: 一个农民有农场,上面有一些虫洞和路,走虫洞可以回到 T秒前,而路就和平常的一样啦,需要花费时间走过.问该农民可不可能从某个点出 ...

  8. shiro 静态页面资源不显示 解决方案(转)

    最近做一个ssm+shiro的框架整和 不加shiro之前ssm中css和图片显示正常.加上以后无法显示. 解决方案: shiro有静态资源过滤. 配置资源匿名访问即可 <property na ...

  9. UIActionSheet上加入UIPickerView iOS8替换方案

    此套替换方案採用"UIView+动画"方式实现(将UIActionSheet替换为UIView) 界面层级例如以下: 第一层:view(这一层充满整个屏幕,初始化时颜色为透明.us ...

  10. ZOJ 1136 Longest Ordered Subsequence DP

    传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1136 题目大意:给定一串序列,求最长的升序列长度,如1, 7, 3, ...