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.
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.
32.
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
33.
ModelAndView modelAndView) throws Exception {
34.
35.
}
36.
37.
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.