前兩天在開發(fā)過程中够颠,因為登錄信息放在了session中乔煞。
SecurityUtils.getSubject().getSession().setTimeout(-10001);
// 如果URL不為空吁朦,則判斷為遠(yuǎn)程認(rèn)證,驗證通過跳轉(zhuǎn)到URL渡贾,并攜帶用戶信息
String url = request.getParameter("url");
Map<String, Object> data = Maps.newHashMap();
session.setAttribute("username", username);
session.setMaxInactiveInterval(900);//15分鐘后session失效
response.init(0, "登錄成功");
response.getData().put("url", "/iwifi/app/employeeview.html");
遇到了一個問題逗宜,就是當(dāng)用戶session過期后,刷新頁面之后不能正晨丈В回到登錄頁面纺讲。而是非法訪問了攔截器所攔截的資源。
本來以為在攔截器里面判斷一下訪問路徑囤屹,和session的情況熬甚,如果為空,直接 response.sendRedirect到登錄頁面就是了肋坚。但是比較麻煩的是乡括。頁面里面的請求都是ajax請求,對于ajax請求的頁面智厌,XMLHTTPRequest對象發(fā)起的而不是瀏覽器诲泌,在驗證失敗后的頁面跳轉(zhuǎn)無法反應(yīng)到瀏覽器中,因為服務(wù)器返回(或輸出)的信息被JavaScript(XMLHTTPRequest對象)接到了铣鹏。
故不能直接用 response.sendRedirect直接返回档礁。
解決方案如下:
在攔截器里面加入:
if (request.getSession().getAttribute("username")==null){
String url = request.getRequestURI();
if (url.matches("/iwifi/app/(.*)")){//判斷訪問資源路徑
if( request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equals("XMLHttpRequest") ) {
response.setHeader("sessionstatus", "timeout");//請求頭加入sessionstatus超時信息
} else {
response.sendRedirect( request.getContextPath() + "loginapp.html");
}
return false;
}
}
在JS里面加入:
//全局的ajax訪問,處理ajax清求時sesion超時
$.ajaxSetup({
contentType : "application/x-www-form-urlencoded;charset=utf-8",
complete : function(XMLHttpRequest, textStatus) {
var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus"); // 通過XMLHttpRequest取得響應(yīng)頭吝沫,sessionstatus,
if (sessionstatus == "timeout") {
// 如果超時就處理 递礼,指定要跳轉(zhuǎn)的頁面
window.location.replace("../../iwifi/loginapp.html");
}
}
});
這樣即可解決ajax請求遇到session丟失的情況惨险。