ajax請求遇到session過期又被過濾器攔截的解決方案
阿新 • • 發佈:2019-01-25
最近寫專案碰到一個比較棘手的問題,就是當用戶session過期時,訪問html頁面,瀏覽器會載入快取裡的html頁面,導致沒有被過濾器攔截,而裡面的ajax請求卻被過濾器攔截了,導致頁面什麼都沒有顯示。
在網上找了一些解決方案,感覺都比較複雜,於是自己想了一個解決方案,也拿出來給大家參考一下。
在過濾器裡判斷是否為ajax請求,ajax請求的請求頭裡有ajax特有的引數X-Requested-With:XMLHttpRequest
,如果是ajax請求,則響應一個用於判斷使用者登入是否過期的json資料。
過濾器:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) { //如果使用者不存在
String ajaxHeader = request.getHeader("X-Requested-With"); //獲取ajax引數值
if("XMLHttpRequest".equals(ajaxHeader)) { //如果是ajax請求
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = response.getWriter();
out.write("{\"status\":401,\"msg\":\"您的登入已過期\"}" ); //json資料
out.flush();
out.close();
}else {
response.sendRedirect("login.html");
}
}else {
filterChain.doFilter(servletRequest,servletResponse);
}
}
ajax的回撥函式:
function (data) {
if(data.status == 200){
...
}else if(data.status == 401) { //登入過期,跳轉到登入介面
window.location.href="login.html";
}else{
...
}
}