原因:
ajax请求默认就是不支持重定向的,因为它是局部刷新,不重新加载页面。


解决方案:

开发中需要多处使用重定向的情况下,大多都是在Spring mvc 的拦截器中,或过滤器中使用,此方法是在spring mvc拦截器中实现。

在拦截器中通过获取session(我的用户信息是存在session中)判断用户的登陆状态,没有登陆重定向到登陆页面。


请求路径获取:

1. request.getScheme() 返回当前链接使用的协议;

2. request.getServerName() 获取网站的域名;

3. request.getServerPort() 获取的服务器的请求端口;

4. request.getContextPath()获取当前的系统路径;


后端代码:



1. 

2.


import java.io.IOException;


3.




4.


import javax.servlet.http.HttpServletRequest;


5.


import javax.servlet.http.HttpServletResponse;


6.


import javax.servlet.http.HttpSession;


7.




8.


import org.apache.log4j.Logger;


9.


import org.springframework.web.servlet.HandlerInterceptor;


10.


import org.springframework.web.servlet.ModelAndView;


11.




12.


public class LoginInterceptor implements HandlerInterceptor{


13.




14.

private static Logger logger = Logger.getLogger(LoginInterceptor.class);


15.

@Override



16.

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)



17.

throws Exception {


18.

response.setHeader("Access-Control-Allow-Origin", "http://localhost"); // 允许跨域请求



19.

response.setHeader("Access-Control-Allow-Credentials", "true");


20.

HttpSession session = request.getSession();


21.

Object userId = session.getAttribute("userId");


22.

if(userId == null){


23.

logger.info("用户未登录");


24.

requestDirect(request, response);


25.

return false;


26.

}else{


27.

return true;


28.

}


29.

}


30.




31.

@Override



32.

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,



33.


ModelAndView modelAndView) throws Exception {


34.




35.

}


36.




37.

@Override



38.

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)



39.

throws Exception {


40.




41.

}


42.




43.

public void requestDirect(HttpServletRequest request, HttpServletResponse response) throws IOException{


44.

//获取当前请求的路径



45.

String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath();


46.

//如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求



47.

if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){


48.

//前端需要判断是否是重定向



49.

response.setHeader("REDIRECT", "REDIRECT");


50.

//需要重定向的路径



51.

response.setHeader("CONTENTPATH", basePath+"/login.html");


52.

response.setStatus(HttpServletResponse.SC_FORBIDDEN);


53.

}else{


54.

response.sendRedirect(basePath + "/login.html");


55.

}


56.

}


57.




58.

}


59.



前端代码:



下面的代码请放在全局的js中 (用于初始化ajax请求,让它结束之后运行completer后面的函数)

1. 

2.


var jqxhr;


3.

//设置ajax请求完成后运行的函数,



4.

$.ajaxSetup({


5.

complete:function(){


6.

if("REDIRECT" == jqxhr.getResponseHeader("REDIRECT")){ //若HEADER中含有REDIRECT说明后端想重定向,



7.

var win = window;


8.

while(win != win.top){


9.

win = win.top;


10.

}


11.

win.location.href = jqxhr.getResponseHeader("CONTENTPATH");//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求



12.

}


13.

}


14.

});


15.



​$.ajaxSetup()方法的详解链接