当前位置:首页 > 开发 > 编程语言 > Java > 正文

关于在javaweb开发中禁用cookie

发表于: 2015-05-12   作者:京都剑豪   来源:转载   浏览:
摘要:     今天公司项目发现一个情况,在禁用了cookie之后网站无法登陆,开始并没有碰到这种情况,也是手忙脚乱的检查了半天。     首先,是错误提示,错误提示一直是验证码错误,OK,在对应的action上面打个断点,然后再次登录。登录的报错代码如下    //验证码 String ccode = request
    今天公司项目发现一个情况,在禁用了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。 问题解决

关于在javaweb开发中禁用cookie

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Cookie-简介: 是在客户端访问web服务器时候,服务器在客户端的机器上存放的信息。 服务器将Cookie
会话 什么是会话? 在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话
一、会话的概念   会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源
当我们通过一个表单验证来连接数据库时,最关键的就是要确保浏览器的resquest端和服务器的response
JavaWeb利用cookie记住账号。 首先,来看看界面什么样子。 记住账号最普遍的做法,就是在点击登录时
JavaWeb利用cookie记住账号。 首先,来看看界面什么样子。 记住账号最普遍的做法,就是在点击登录时
cookie是附加在http请求中的,tornado默认的set_cookie和get_cookie方法是明文不加密传输的,而set_
前一阵子,我们发现高版本的Safari中默认会阻止第三方cookie,如下图所示。 问题 什么是第三方cooki
前一阵子,我们发现高版本的Safari中默认会阻止第三方cookie,如下图所示。 问题 什么是第三方cooki
前一阵子,我们发现高版本的Safari中默认会阻止第三方cookie,如下图所示。 问题 什么是第三方cooki
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号