對於頁面來講,處理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"; } });