瀏覽器禁用了cookie怎麼辦

前言

在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,都是一種數據持久化的技術手段,如果大家知道有其它手段都可以使用,前提是瀏覽器支持該技術而且沒有禁用該技術。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章