cookie session(http://leeqianjun.javaeye.com/blog/472293)

本文目录:

   1. Cookie 来由

   2. Cookie 用途

   3. 生命周期

   4. Cookie 工作机制

   5. Cookie 操作方法

   6. Cookie几种读取区别

   7. Cookie 跨域

 

 

1. Cookie 来由

      进入互联网时代,大部分的应用都基于互联网,采用B/S模式或者B/S与C/S结合的方式处理。但是http协议是无状态的协议,一个应用可能需要记录用户的登录状态、操作行为等等,那么就需要一个令牌一样的东西,记录客户端机器的相应的数据,因而Cookie诞生了。

 

2. Cookie 用途

Cookie 是浏览器提供的一种机制, cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。在机器上体现为一个文本文件,cookie机制将信息以一个文本文件形式存储于用户硬盘,因此可以作为全局变量,这是它最大的一个优点。它可以用于以下几种场合。
      1.   保留用户的登录状态
      2.   跟踪用户的行为,进行相应的统计分析
      3.   定制用户的应用界面
等等,Cookie使用场合太多了。在当前的互联网应用中,如果禁用了Cookie,那是不可想象的,几乎是寸步难行。    

 

3. 生命周期

      Cookie 变量虽然存放在Client 端机器上,却也不是永远不会消失的。可以通过Cookie 的过期时间来处理(以Java为例)。过期的时间类型为Int型值,

       -1:表示本session有效,即在本浏览器打开的周期内有效,浏览器关闭后Cookie也被删除

      >=0: 表示Cookie的有效器,以秒为单位设置cookie 最大的有效时间,明确值指定cookie 将在多少秒过后失效。注意,这个值是cookie 有效期满的最大值,不是当前cookie 的存在时间。

 

4. Cookie 工作机制

      Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于 JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。

      其处理的步骤为:

步骤一:在服务器端创建Cookie(客户端也是可以的,在服务端创建安全性高,这里以E网打进为例)

                 我们创建了一个名字为 COOKIE_EUP_TMP 的Cookie来包含访问者的信息,创建Cookie时设置:

 

Java代码
  1.               Cookie cookie = new Cookie("COOKIE_EUP_TMP","cookieValue");   
  2.               cookie.setDomain("cn.alisoft.com");   
  3.               cookie.setPath("/");   
  4.               cookie.setMaxAge(-1);   
  5.              this.getResponse().addCookie(cookie);  
             Cookie cookie = new Cookie("COOKIE_EUP_TMP", "cookieValue");
             cookie.setDomain("cn.alisoft.com");
             cookie.setPath("/");
             cookie.setMaxAge(-1);
             this.getResponse().addCookie(cookie);

 

     注意: 在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,
完成浏览器的认证操作。

 

     此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如:

 

         Domain属性:能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传达室到指定的服务器上,而决不会跑到其他的如www.hp.com的Web站点上去。

         Expires属性:则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie 太多,超过了系统所允许的范围,浏览器将自动对它进行删除。

         Path属性:用来指定Cookie将被发送到服务器的哪一个目录路径下。

 

     说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。

 

 

5. Cookie 操作方法

 

     java的写Cookie的方法:

 

Java代码
  1. Cookie cookie = new Cookie("COOKIE_EUP_TMP","cookieValue");   
  2. cookie.setDomain("cn.alisoft.com");   
  3. cookie.setPath("/");   
  4. cookie.setMaxAge(-1);   
  5. this.getResponse().addCookie(cookie);  
Cookie cookie = new Cookie("COOKIE_EUP_TMP", "cookieValue");
cookie.setDomain("cn.alisoft.com");
cookie.setPath("/");
cookie.setMaxAge(-1);
this.getResponse().addCookie(cookie);

删除Cookie的方法:

        指定 maxAge = 0 即可

 

    PS:在实际的使用中,Cookie值需要经过加密进行处理的,而且不能存储过多的数据,否则会影响页面的浏览速度。在web应用中,一般把静态资源(JS,CSS,IMAGE)等资源和web应用的域名分开来处理,那么静态资源就不会带有Cookie,能极大的提高Web应用的浏览速度。

 

6. Cookie几种读取区别

 

    下面以cn.alisoft.com域名为例,用几个域名来验证test.cn.alisoft.com,cn.alisoft.com,alisoft.com三个父子域名的读取区别:

 

     步骤一、在域cn.alisoft.com 写入名称为:COOKIE_EUP_TMP 时效为:60*60 的Cookie

     步骤二、在域cn.alisoft.com 新开浏览器执行读取,可读到 COOKIE_EUP_TMP 值

                 在域test.cn.alisoft.com 新开浏览器执行读取,可读到 COOKIE_EUP_TMP 值

                 在域alisoft.com 新开浏览器执行读取,读不到 COOKIE_EUP_TMP 值

 

     另外我们增加Path的形式写入Cookie:

     步骤一、在域cn.alisoft.com 写入名称为:COOKIE_EUP_TMP Path:/home 时效为:60*60 的Cookie

     步骤二、在域cn.alisoft.com 新开浏览器执行读取,在home目录下,可读到 COOKIE_EUP_TMP 值

                 在域cn.alisoft.com 新开浏览器执行读取,在search目录下,读不到 COOKIE_EUP_TMP 值

 

     结论:子域名可读父域名写入的Cookie,反之不行。如果设置了Path特性,那么只有这个Path路径下可读。

 

 

6. Cookie 跨域

     说到Cookie跨域,不得不说第一方Cookie和第三方Cookie,

      第一方Cookie:是来自当前正在查看的网站,或者发送到当前正在查看的网站。

      第三方Cookie :是来自当前正在查看的网站以外的网站,或者发送到当前正在查看的网站以外的网站。第三方网站通常提供正在查看的网站上的内容。例如,许多站点使用来自第三方网站的广告,或者iframe的别的网站的url,这些第三方的网站可能使用的Cookie

      下面以一个例子说明(第一方:www.b.com,第二方:www.a.com):

 

       描述:

 

          http://www.b.com/home/index.xsp 中iframe 嵌入了 http://www.a.com:8080/home/b.xsp

 

       操作步骤:

            步骤一:调用 http://www.a.com:8080/home/a.xsp写入 www.a.com 名称为:CookieName 的Cookie

            步骤二:在浏览器中输入:http://www.b.com/home/index.xsp ,内嵌的 http://www.a.com:8080/home/b.xsp 无法读取www.a.com的Cookie信息,这个就是跨域造成的。

 

       解决方法:

            在 http://www.a.com:8080/home/a.xsp 写Cookie的时候增加 P3P头:

Java代码
  1. this.getResponse().addHeader("P3P: CP","CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV");  
this.getResponse().addHeader("P3P: CP", "CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV");

            重新在浏览器输入:http://www.b.com/home/index.xsp ,内嵌的 http://www.a.com:8080/home/b.xsp 就可以读到 www.a.com 写入的Cookie信息。

 

       PS:对于P3P,说起来就话长了,还不易说清楚,还是读者自己去查吧。公司的安全工程师说P3P头不安全,对于详细的不安全表现还不了解,待了解清楚后再续。

 

转自:http://leeqianjun.javaeye.com/blog/472293

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值