<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

    關(guān)于cookie特殊字符的一點理解

    背景:
    加密的cookie信息中帶有特殊字符(“=”),導(dǎo)致讀cookie的時候,特殊符號丟失,解密失敗

    看了同事“關(guān)于cookie特殊字符”的說明郵件,和網(wǎng)上對cookie特殊字符問題的解釋:

    我們在實際使用Cookie過程中要注意一些問題:

      1. Cookie的兼容性問題

      Cookie的格式有2個不同的版本,第一個版本,我們稱為Cookie Version 0,是最初由Netscape公司制定的,也被幾乎所有的瀏覽器支持。而較新的版本,Cookie Version 1,則是根據(jù)RFC 2109文檔制定的。為了確保兼容性,JAVA規(guī)定,前面所提到的涉及Cookie的操作都是針對舊版本的Cookie進行的。而新版本的Cookie目前還不被Javax.servlet.http.Cookie包所支持。

      2. Cookie的內(nèi)容

      同樣的Cookie的內(nèi)容的字符限制針對不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括號,圓括號,等于號(=),逗號,雙引號,斜杠,問號,@符號,冒號,分號都不能作為Cookie的內(nèi)容。這也就是為什么我們在例子中設(shè)定Cookie的內(nèi)容為“Test_Content”的原因。

      雖然在Cookie Version 1規(guī)定中放寬了限制,可以使用這些字符,但是考慮到新版本的Cookie規(guī)范目前仍然沒有為所有的瀏覽器所支持,因而為保險起見,我們應(yīng)該在Cookie的內(nèi)容中盡量避免使用這些字符。

    摘自:http://swingchen.bokee.com/6200015.html
    類似這樣的解釋,搜索出來的結(jié)果,挺多。

    但是,我去看了RFC2109(http://www.faqs.org/rfcs/rfc2109.html),其說明如下:

    value中的token,是有一組非特殊字符,非空白字符。而它是在RFC 2068(http://www.faqs.org/rfcs/rfc2068.html)中制定的 (是對Header的規(guī)范),請看:


    也就是說,所謂的Cookie1,同樣有特殊字符的限制。
    同樣,在Cookie2(RFC2965)中,也如此。

    想想也是啊,如果沒有特殊字符的限制,解析Header的時候,還不亂套了?

    看了RFC之后,我們再來看看Tomcat中的實現(xiàn)(6.0.29版本),請看:
    org.apache.tomcat.util.http.Cookies

    1.類注釋:
    A collection of cookies - reusable and tuned for server side performance.
    Based on RFC2965 ( and 2109 )
    是基于RFC2965/RFC2109規(guī)范來實現(xiàn)的

    2.特殊字符的定義
    /*
        List of Separator Characters (see isSeparator())
        Excluding the '/' char violates the RFC, but 
        it looks like a lot of people put '/'
        in unquoted values: '/': ; //47 
        '\t':9 ' ':32 '\"':34 '(':40 ')':41 ',':44 ':':58 ';':59 '<':60 
        '=':61 '>':62 '?':63 '@':64 '[':91 '\\':92 ']':93 '{':123 '}':125
        
    */
        
    public static final char SEPARATORS[] = { '\t'' ''\"''('')'','
            
    ':'';''<''=''>''?''@''[''\\'']''{''}' };
    根據(jù)規(guī)范,定義了特殊字符。除了“/”這個符號。因為大多數(shù)人會直接使用“/”。

    3.針對“=”特殊處理
    /**
     * If true, cookie values are allowed to contain an equals character without
     * being quoted.
     
    */
    public static final boolean ALLOW_EQUALS_IN_VALUE;

    static {
        ALLOW_EQUALS_IN_VALUE 
    = Boolean.valueOf(System.getProperty(
                
    "org.apache.tomcat.util.http.ServerCookie.ALLOW_EQUALS_IN_VALUE",
                
    "false")).booleanValue();
    }
    可以在catalina.properties中,添加這個配置項 (或者啟動過程中加上-D參數(shù)),使得cookie value中允許存在“=”符號。
    所以本文開頭提到的問題,可以使用這個方法得到解決

    4.解析過程
    /**
     * Parses a cookie header after the initial "Cookie:"
     * [WS][$]token[WS]=[WS](token|QV)[;|,]
     * RFC 2965
     * JVK
     
    */
    public final void processCookieHeader(byte bytes[], int off, int len){
        
    //詳細代碼,省略
    }


    備注:
    RFC沒有仔細看(時間有限,并且看E文挺累的),如理解有誤,請告知。


    posted on 2010-11-03 13:27 stone2083 閱讀(7203) 評論(1)  編輯  收藏 所屬分類: java

    Feedback

    # re: 關(guān)于cookie特殊字符的一點理解[未登錄] 2013-12-13 04:30 匿名

    HTTP中很多地方都限定不能使用一些字符,如果使用可以加解密,類似UrlEncode/UrlDecode,存儲是加密將這些特殊符號轉(zhuǎn)換為非特殊符號,讀取時解密將轉(zhuǎn)化后的非特殊符號再轉(zhuǎn)換回特殊符號  回復(fù)  更多評論   

    主站蜘蛛池模板: 亚洲国产精品自在自线观看| 亚洲AV无码成人专区片在线观看| 亚洲黄色在线电影| 国产精品免费高清在线观看| 亚洲五月午夜免费在线视频| 91av视频免费在线观看| 亚洲成色WWW久久网站| 九九美女网站免费| 久久精品国产亚洲AV无码麻豆| 久久免费公开视频| 亚洲第一精品电影网| 91精品免费在线观看| 亚洲啪AV永久无码精品放毛片 | 亚洲国产AV无码专区亚洲AV| 两个人看的www免费视频| 亚洲VA中文字幕无码一二三区| 日本高清高色视频免费| 亚洲日本在线观看| 亚洲人成电影网站免费| 亚洲a∨无码精品色午夜| 亚洲av再在线观看| 3344在线看片免费| 亚洲国产成人久久99精品| 无码一区二区三区免费视频| 欧洲乱码伦视频免费国产| 亚洲精品无码永久在线观看你懂的| 99精品免费视品| 亚洲欧洲尹人香蕉综合| 好爽好紧好大的免费视频国产| a毛片成人免费全部播放| 久久亚洲私人国产精品| 蜜桃精品免费久久久久影院| 黄网站在线播放视频免费观看| 久久久久久久综合日本亚洲| 亚洲免费在线观看视频| 国产亚洲视频在线| 久久久亚洲精品无码| 国内精品免费视频自在线| 国产精品美女免费视频观看| 亚洲黄色三级网站| 亚洲AV无码不卡在线观看下载|