关于在javaweb开发中禁用cookie_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 关于在javaweb开发中禁用cookie

关于在javaweb开发中禁用cookie

 2015/5/13 1:50:36  京都剑豪  程序员俱乐部  我要评论(0)
  • 摘要:今天公司项目发现一个情况,在禁用了cookie之后网站无法登陆,开始并没有碰到这种情况,也是手忙脚乱的检查了半天。首先,是错误提示,错误提示一直是验证码错误,OK,在对应的action上面打个断点,然后再次登录。登录的报错代码如下//验证码Stringccode=request.getParameter("ccode");setObj2ActionContext("ccode",ccode);//记住密码Stringremember=request.getParameter
  • 标签:javaweb Web Java Web开发 开发 Cookie
    今天公司项目发现一个情况,在禁用了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。 问题解决
发表评论
用户名: 匿名