一. 原因
ajax 是默认就是不支持重定向的,它是局部刷新,不重新加载页面。
二. 解决办法
我的解决办法就是从前后端都做处理,项目中遇到重定向大多出现在拦截器或者过滤器中。在项目中我使用spring的拦截器去拦截所有的action请求,判断当前用户有无登录,若没有登录就重定向到登录页面。
1. 后端处理的代码
public class MyInterceptor extends HandlerInterceptorAdapter{
//该方法是进入controller的必经之路。
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
if(是否登录了?){
return true;
}else { //没有登录重定向到登录页面
reDirect(request, response);
return false;
}
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
super.afterCompletion(request, response, handler, ex);
}
//对于请求是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");
}
}
}
说明一下请求路径的获取:
(1). request.getScheme() 返回当前链接使用的协议;比如,一般应用返回http;SSL返回https;
(2). request.getServerName() 获取网站的域名,如果是在本地的话就是localhost
(3). request.getServerPort() 获取的服务器的请求端口
(4). request.getContextPath()获取当前的系统路径
2. 前端处理的代码
(1). 下面的代码请放在全局的js中 (用于初始化ajax请求,让它结束之后运行completer后面的函数)
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去实现重定向的要求
}
}
});
(2). 只要有ajax请求就让它的返回值为jqxhr
比如:jqxhr = $.post(url, requestData, function(result){})