[JS] Ajax請求會話過時處理

對於頁面來講,處理session過時比較簡單,通常只需在過濾器裏面判斷session用戶是否存在,不存在則跳轉頁面到登錄頁便可。html

對於Ajax請求來講,這個辦法則無效,只能獲取到登陸頁的html代碼。緣由在於Ajax請求是XMLHTTPRequest對象發起的而不是瀏覽器,而服務器返回的信息接收者也是XMLHTTPRequest,非瀏覽器。ajax

 

解決辦法:瀏覽器

服務器端服務器

  可在返回的ResponseHeader裏添加一個標識變量,以便在Javascript裏處理。以Java爲例,可在過濾器裏進行以下處理:session

try {
    // Ajax請求會話過時處理
    String requestType = request.getHeader("X-Requested-With");
    if (StringUtils.isNotEmpty(requestType) && requestType.equalsIgnoreCase("XMLHttpRequest")) {
        response.setHeader("SessionStatus", "sessionTimeOut");
        requestContext.abortWith(Response.status(401).build());
        return;
    }
    // 處理頁面跳轉
    requestContext.abortWith(Response.accepted().build());
    response.sendRedirect(loginPath);
} catch (IOException ex) {
    //do nothing
}

 

Javascript端ui

  可經過JQuery的ajaxComplete方法進行處理,判斷髮送請求時是否會話已過時。spa

/**
 * ajax請求判斷會話是否已過時
 */
$(document).ajaxError(function (event, jqXHR, options, errorMsg) {
    var sessionStatus = jqXHR.getResponseHeader('SessionStatus');
    if (sessionStatus && sessionStatus === 'sessionTimeOut') {
        alert("您的會話已過時,請從新登陸");
        location.href = "login";
    }
});
相關文章
相關標籤/搜索