1.问题如下:
前端发起ajax请求 -> 后端拦截器进行校验(preHandle) -> 发现用户失效 -> 重定向到登录页( response.sendRedirect() )
通过F12, 我们可以看到方法已经执行, 但是页面没有跳转过去? ? ?
2.问题分析:
ajax的机制, 就是通过XMLHttpRequest对象向服务器发送请求,从服务器获取数据! 除此之外它不能做以外的其它动作了。
ajax功能就是这么设定的( 局部刷新 ), ajax也是这么做的, 它的作用也仅仅局限于此, 所以浏览器端是不会发起重定向的, 不会重新加载页面的。
3.解决办法:
只能通过服务器端告诉 ajax, 请求失效了, 让它location.href = “”, 跳转到登录页面.
1.过滤器里再加个ajax请求判断,
/**
* ajax请求重定向问题的处理方法
*/
public void ajaxRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
response.setHeader("REDIRECT", "REDIRECT"); //表示重定向
response.setHeader("CONTENTPATH", request.getContextPath() + "/index"); //重定向的路径
response.setStatus(HttpServletResponse.SC_FORBIDDEN); //拒绝访问.
} else {
response.sendRedirect(request.getContextPath() + "/index");
}
}
2."XMLHttpRequest"表明就是ajax请求
3.前端js加一个方法, 进行跳转.
var jqxhr;
//设置ajax请求完成后运行的函数,
$.ajaxSetup({
complete:function(){
if("REDIRECT" == jqxhr.getResponseHeader("REDIRECT")){ //若HEADER中含有REDIRECT说明后端想重定向,
var win = window;
while(win != win.top){
win = win.top;
}
win.location.href = jqxhr.getResponseHeader("CONTENTPATH");//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
}
}
});