原文:https://www.cnblogs.com/yanduanduan/p/6252203.html
當前端在用ajax請求時,如果沒有設定session超時時間並且做跳轉到登入介面的處理,那麼只是靠後臺是很難完成超時的一系列動作的;但是如果後臺
沒有封裝一個ajax請求公共類,那麼在ajax請求上下功夫解決session超時的問題是不行的,只有考慮在後臺或者前臺通過全域性來進行對ajax請求超時的
處理了。
本人用的是spring security來處理的,想只通過後臺來進行處理,但是嘗試了很多種辦法,但是一直沒有成功,session一超時,前臺頁面就一直顯示遮
罩層,只有在重新整理後才能正常操作。最終還是考慮在前臺上下功夫,通過使用jquery的全域性事件,就搞定了。
1.在spring-security.xml配置session超時時觸發的方法(配置在<security:http>標籤內)
<security:http>
<security:session-management invalid-session-url="/timeout"></security:session-management>
</security:http>
2.超時處理方法程式碼
@RequestMapping(value = "/timeout")
public void sessionTimeout(HttpServletRequest request,HttpServletResponse response) throws IOException {
if (request.getHeader("x-requested-with") != null
&& request.getHeader("x-requested-with").equalsIgnoreCase(
"XMLHttpRequest")) { // ajax 超時處理
response.getWriter().print("timeout"); //設定超時標識
response.getWriter().close();
} else {
response.sendRedirect("/login");
}
}
3.前臺監聽超時方法
$(document).ajaxComplete(function(event,obj,settings){
if (obj.responseText == 'timeout') { //超時標識
location.href='/login'; //跳轉到登入頁面
}
})
這裡使用jquery的全域性事件,通過 ajaxComplete() 方法規定的函式會在請求完成時執行,即使請求並未成功
或者至二級修改全域性ajax的Complete方法
$(document).ajaxComplete(function(event,obj,settings){
alert(obj.status);
})