java中的cookie--转

先说一个误区:

1.Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。

 

以上提到的仅仅针对javax.servlet.http.Cookie,反编译源码可以看到private int version = 0;但是java还有其他的cookie类,是可以支持到version1的。

 

 

”javax.servlet.http.Cookie“,通常我们会使用这个类来处理本地存储的cookie,但是如下firebug抓包可以看到,request中的cookie对象是一整个string,这里就涉及到解析cookie的问题。(tomcat源码中有处理request中cookie[]的方法),

 

 

另外java本身有一个类java.net.HttpCookie,~~~根据官方doc文档显示,java6里面其实已经支持各种规范的cookie格式,但在创建的时候,得注意设置version版本

Java代码 复制代码 收藏代码
  1. public final class HttpCookie extends Object   
  2. implements Cloneable   
  3. HttpCookie 对象表示一个 http cookie,该 cookie 带有服务器和用户代理之间的状态信息。广泛采用 Cookie 来创建有状态 (stateful) 会话。   
  4. 有 3 种 http cookie 规范:   
  5.     Netscape 草案   
  6.     RFC 2109 - http://www.ietf.org/rfc/rfc2109.txt   
  7.     RFC 2965 - http://www.ietf.org/rfc/rfc2965.txt    
  8. HttpCookie 类可以接受所有这 3 种语法形式。   
  9. 从以下版本开始:    1.6   
public final class HttpCookie extends Object
implements Cloneable
HttpCookie 对象表示一个 http cookie,该 cookie 带有服务器和用户代理之间的状态信息。广泛采用 Cookie 来创建有状态 (stateful) 会话。
有 3 种 http cookie 规范:
    Netscape 草案
    RFC 2109 - http://www.ietf.org/rfc/rfc2109.txt
    RFC 2965 - http://www.ietf.org/rfc/rfc2965.txt 
HttpCookie 类可以接受所有这 3 种语法形式。
从以下版本开始:    1.6 

并且这个类的方法parse可以直接用来解析request的cookie对象得到cookie数组,即req.getHeader("cookie")

Java代码 复制代码 收藏代码
  1. public static List<HttpCookie> parse(String header)  
public static List<HttpCookie> parse(String header)

 

在这个类里面有一个guessCookieVersion方法,也大致说明了几个版本间的主要区别:这里可以看到其实expires属性仅仅是Netscape版本使用而已,并非所有cookie都有这个玩意:)

Java代码 复制代码 收藏代码
  1. /*  
  2.  * try to guess the cookie version through set-cookie header string  
  3.  */  
  4. private static int guessCookieVersion(String header) {   
  5.     int version = 0;   
  6.        
  7.     header = header.toLowerCase();   
  8.     if (header.indexOf("expires=") != -1) {   
  9.         // only netscape cookie using 'expires'   
  10.         version = 0;   
  11.     } else if (header.indexOf("version=") != -1) {   
  12.         // version is mandatory for rfc 2965/2109 cookie   
  13.         version = 1;   
  14.     } else if (header.indexOf("max-age") != -1) {   
  15.         // rfc 2965/2109 use 'max-age'   
  16.         version = 1;   
  17.     } else if (startsWithIgnoreCase(header, SET_COOKIE2)) {   
  18.         // only rfc 2965 cookie starts with 'set-cookie2'   
  19.         version = 1;   
  20.     }   
  21.        
  22.     return version;   
  23. }  

posted on 2014-07-16 00:08  tom_ljf  阅读(427)  评论(0)    收藏  举报

导航