單點登錄Session超時,Ajax請求不能正常跳轉到登錄界面
場景描述
前端:nui+jQuery
nui是前端mini jquery ui的別名,除了增加數據字典的組件,其他均一樣;
後端:EOS
EOS是普元信息技術股份有限公司的快捷開發平台的產品;
現有企業內部管理系統,前後端的交互,80%均採用ajax來實現的。
這種模式的優勢在於:
減少前後端不必要的交互(全部刷新)
減輕伺服器端的壓力(合理使用客戶端機器的資源)。
有利必有弊,弊端:
部分刷新,session超時後,後端攔截到ajax的請求,會redirect到登錄界面,但是Ajax的核心功能並非處理跳轉。
解決方案:
分兩步進行解決
在攔截器中區別Ajax請求和正常的http請求。
jQuery中的全局方法進行統一處理(每個ajax增加,工作量太大)。
第一步:區別ajax
如圖,ajax請求中,
包含X-Requested-With的請求頭,
而且其value固定為XMLHttpRequest
偽代碼如下:
if(session==null){
//ajax請求的
if(X-Requested-With.equals("XMLHttpRequest")){
返回跳轉到登錄頁面的標識
}else{//其他
直接跳轉到登錄頁面
}
}
第二步:jquery的全局方法
$(document).ajaxComplete(function (evt, request, settings) {
var text = request.responseText;
//獲取第一步返回的跳轉到登錄頁面的標識
if (text == "logout") {
top.location = "/login.html";
//如果使用了iframe,需要設置其父frame的鏈接為登錄頁面
}
})
必須要放在統一的入口,才能避免每個ajax請求增加該方法。
我是單獨寫了一個js文件,然後在統一應用的nui.js中增加這個js的引用。


TAG:元頁石 |