今天公司项目
发现一个情况,在禁用了cookie之后网站无法登陆,开始并没有碰到这种情况,也是手忙脚乱的检查了半天。
首先,是
错误提示,错误提示一直是验证码错误,OK,在对应的action上面打个断点,然后再次登录。登录的报错代码如下
//验证码
String ccode = request.getParameter("ccode");
setObj2ActionContext("ccode", ccode);
//记住密码
String remember = request.getParameter("remember");
setObj2ActionContext("remember", remember);
//来自哪个登录页面
String from = request.getParameter("from");
//设置页面不缓存
CommonUtil.setAjaxResponseAttr(response);
//1.拿到系统验证码
Object rand = request.getSession().getAttribute("rand");
if (!"newPage".equals(from) &&!ccode.equals(rand)) {
setObj2ActionContext(Constants.MSG, "01");//01:验证码不正确
if(Constants.LOGIN_FROM_CEF.equals(from)){//来自cef登录客户端
return Constants.TO_CEF_LOGIN;
}else{
return Constants.TO_LOGIN;
}
}
上面页面获得的值一直很正常,可是到了获得rand值的时候,我发现rand的值是null;开始以为rand是session没有给到值,可是找到源头,发现session存储的rand的初始值并不是null,而是""。
这个时候我暂时先关闭了禁用cookie,登陆正常之后,顺手先
开启禁用禁用cookie,这个时候再点击退出的时候,系统直接爆出了700错误:登陆
超时。
这时候我似乎明白这个错误可能和登陆session有关,禁用了cookie之后,打开百度准备登陆百度账号,结果发现百度提示需要关闭禁用cookie才可以登陆。好吧碰到这种情况,百度一下是我们最忠实的伙伴,关键词:禁用cookie session 获得答案如下:
SESSION并不是COOKIE的子集ASP中:SESSION 必须倚赖COOKIE才可用,SESSION是存储在服 务器端的,而COOKIE是存储在客户端的,相对而言,SESSION的
安全性和可靠程度都比COOKIE高ASP.NET中SESSION可以不依赖COOKIE而存在!!!
也就是说,从微软的方面来说,开始让SESSION摆脱COOKIE的束缚了!!
Session数据是存储在服务器上的,Cookie数据是存储在浏览器本机上的.
但如果浏览器不支持使用/接受Cookie,则不能使用Session.
这是因为,虽然Session真正的数据是存储在服务器上的,但每个Session都对应了一个由Web服务器指定的唯一识别符SeesionID,而在浏览器里是使用Cookie来存储这个SeesionID的.所以使用Session,浏览器必须支持Cookie.
cookie是一个特殊的信息
只是服务器存于用户计算机上的一个文本文件
Session很大的实际
意义的
当一个用户提交了表单时
浏览器会将用户的SessionID自动附加在
HTTP头信息中
当服务器处理完这个表单后
将结果返回给SessionID所对应的用户
客户端的Session信息是存储于Cookie中的
如果客户端完全禁用掉了Cookie功能
他也就不能享受到了Session提供的功能了
好吧,到这儿明白了 禁用cookie = 无法获得本地的sessionId = 无法使用session,所以验证码在后台无法获得值,因为session根本无法获得。然后是百度某位大佬的禁用cookie后session的
使用方法
你需要在所有连接(http href)中加入sid这个参数,以保证session id的传递
当客户端浏览器中禁止 Cookie,
Servlet 容器无法从客户端浏览器中取得作为 Cookie 的 Session ID,也就无法跟踪客户状态。
Java Servlet API 中提出了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,把 Session ID 添加到 URL 信息中。
HttpServletResponse
接口提供了重写 URL 的方法:public java.lang.String encodeURL(java.lang.String url)
该方法的实现机制为:
● 先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。
● 再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。
我们可以对网页中的链接稍作修改,解决以上问题:
修改前:
<a href=“maillogin.jsp“>
修改后:
<a href=“<%=response.encodeURL(“maillogin.jsp“)%>“>
虽然这种方法可以解决禁用cookie问题 但是开发会变得非常麻烦,而且大部分时间内并没有人会
全局禁用session,所以最后我的解决方案是,加了个提示,session存储一个
关键字,
用户登录界面如果无法取到这个关键字,会直接提示请关闭禁用cookie。 问题解决