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中的cookie_第1张图片

 

 

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

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")

public static List<HttpCookie> parse(String header)

 

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

    /*
     * try to guess the cookie version through set-cookie header string
     */
    private static int guessCookieVersion(String header) {
        int version = 0;
        
        header = header.toLowerCase();
        if (header.indexOf("expires=") != -1) {
            // only netscape cookie using 'expires'
            version = 0;
        } else if (header.indexOf("version=") != -1) {
            // version is mandatory for rfc 2965/2109 cookie
            version = 1;
        } else if (header.indexOf("max-age") != -1) {
            // rfc 2965/2109 use 'max-age'
            version = 1;
        } else if (startsWithIgnoreCase(header, SET_COOKIE2)) {
            // only rfc 2965 cookie starts with 'set-cookie2'
            version = 1;
        }
        
        return version;
    }

 

 

你可能感兴趣的:(java,tomcat,servlet,浏览器,Firebug)