原因:
ajax請求默認就是不支持重定向的,因為它是局部刷新,不重新加載頁面。
在攔截器中通過獲取session(我的用戶信息是存在session中)判斷用戶的登陸狀態,沒有登陸重定向到登陸頁面。
請求路徑獲取:
1. request.getScheme() 返回當前鏈接使用的協議;
2. request.getServerName() 獲取網站的域名;
3. request.getServerPort() 獲取的服務器的請求端口;
4. request.getContextPath()獲取當前的系統路徑;
后端代碼:
-
import java.io.IOException;
-
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletResponse;
-
import javax.servlet.http.HttpSession;
-
-
import org.apache.log4j.Logger;
-
import org.springframework.web.servlet.HandlerInterceptor;
-
import org.springframework.web.servlet.ModelAndView;
-
-
public
class LoginInterceptor implements HandlerInterceptor{
-
-
private
static Logger logger = Logger.getLogger(LoginInterceptor.class);
-
@Override
-
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
-
throws Exception {
-
response.setHeader(
"Access-Control-Allow-Origin",
"http://localhost");
// 允許跨域請求
-
response.setHeader(
"Access-Control-Allow-Credentials",
"true");
-
HttpSession session = request.getSession();
-
Object userId = session.getAttribute(
"userId");
-
if(userId ==
null){
-
logger.info(
"用戶未登錄");
-
requestDirect(request, response);
-
return
false;
-
}
else{
-
return
true;
-
}
-
}
-
-
@Override
-
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
-
ModelAndView modelAndView)
throws Exception {
-
-
}
-
-
@Override
-
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
-
throws Exception {
-
-
}
-
-
public void requestDirect(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"))){
-
//前端需要判斷是否是重定向
-
response.setHeader(
"REDIRECT",
"REDIRECT");
-
//需要重定向的路徑
-
response.setHeader(
"CONTENTPATH", basePath+
"/login.html");
-
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
-
}
else{
-
response.sendRedirect(basePath +
"/login.html");
-
}
-
}
-
-
}
前端代碼:
下面的代碼請放在全局的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去實現重定向的要求
-
}
-
}
-
});
$.ajaxSetup()方法的詳解鏈接