浏览器禁用了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,都是一种数据持久化的技术手段,如果大家知道有其它手段都可以使用,前提是浏览器支持该技术而且没有禁用该技术。

    原文作者:huzhenv5
    原文地址: https://blog.csdn.net/huzhenv5/article/details/104527416
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞