前言
在web開發過程中,cookie是我們常用的功能;最基本的用來存儲服務端返回的jsessionid來識別用戶,甚至保存其它更多的客戶信息。假如客戶端瀏覽器禁用了cookie,將會導致很多基於cookie的功能出現異常,甚至無法使用,作爲開發者,我們怎麼來解決這種問題呢?
百度了下,網上出現最多的回答就是URL重寫,其原理就是通過response.encodeURL(***)
或者response.sendRedirect(response.encodeRedirectURL(***))
對要返回前端的url進行重寫。這兩個方法都可以通過request判斷前端是否禁用了cookie,如果禁用了cookie,會自動將;jsessionid=xxx
添加到要返回前端的url後,前端進行請求時就會再url後帶上jsessioonid。
思路
筆者碰到的問題是在在通過session實現登陸保持的情況下,如何讓超時時間內的請求都可以識別到該用戶。如果cookie在可用的情況下很好實現,會自動通過名爲JSESSIONID的cookie來記錄sessionid;如果cookie不可用呢?筆者採用的方法是在登陸成功後將sessionid返回給前端,然後前端通過其它可用的數據持久化技術,將該sessionid保存在客戶端硬盤中(比如使用loalstorage);然後在後面的ajax請求中,通過判斷瀏覽器是否禁用cookie來判斷是否需要將";jsessionid=xxx"
加入到請求的url末尾。
服務端部分代碼:
// 將sessonid返回給前端
retMap.put("sessionId", session.getId());
retMap.put("state", 0);
retMap.put("person", personInfo);
retMap.put("message", "賬號/密碼登陸成功");
前端部分代碼:
$.ajax({
type : 'POST',
data: {
account: account,
password: ps
},
dataType: 'json',
url : getCookieUrl_2("../../sLoginDemo/login.do"),
success: function(res) {
if (res.state == 0) {
console.log(res.message);
// location.href = '../sMain/sMain.html'
// 通過localstorage保存sessionId
supports_html5_storage() && localStorage.setItem('sessionId', res.sessionId);
// sessionId = res.sessionId;
} else {
showAlter && alert('失敗:' + res.message);
}
},
error: function(err) {
showAlter && alert('錯誤:' + err.message);
}
})
/**
* 判斷瀏覽器是否支持localstorage
* */
function supports_html5_storage() {
try {
return 'localStorage' in window && window['localStorage'] !== null;
} catch (e) {
return false;
}
}
/**
* 通過判斷客戶端瀏覽器是否支持cookie來判斷是否將jsessionid加入到url後
* */
function getCookieUrl_2(url) {
// window.navigator.cookieEnabled用於判斷瀏覽器是否支持cookie
if (!window.navigator.cookieEnabled && supports_html5_storage() && localStorage.getItem('sessionId')) {
return url + ';jsessionid=' + localStorage.getItem('sessionId');
}
return url;
}
問題
以上方法看似解決了禁用cookie產生的問題,可是筆者在實際測試過程中發現localstorage同樣有可能被禁用。比如筆者在使用chrome測試的時候,如果禁用了cookie,localstorage會同時被禁用。在這種情況下筆者以上列出的代碼也無法實現通過session來識別用戶。
總之,如果想使用session,客戶端瀏覽器必須通過數據持久化技術來保存sessionId,無論是cookie還是localstorage,都是一種數據持久化的技術手段,如果大家知道有其它手段都可以使用,前提是瀏覽器支持該技術而且沒有禁用該技術。