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