1. 程式人生 > >ajax請求遇到session過期又被過濾器攔截的解決方案

ajax請求遇到session過期又被過濾器攔截的解決方案

最近寫專案碰到一個比較棘手的問題,就是當用戶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{
        ...
    }
}