stone2083

          關于cookie特殊字符的一點理解

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

          看了同事“關于cookie特殊字符”的說明郵件,和網上對cookie特殊字符問題的解釋:

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

            1. Cookie的兼容性問題

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

            2. Cookie的內容

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

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

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

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

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


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

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

          看了RFC之后,我們再來看看Tomcat中的實現(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規范來實現的

          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'' ''\"''('')'','
                  
          ':'';''<''=''>''?''@''[''\\'']''{''}' };
          根據規范,定義了特殊字符。除了“/”這個符號。因為大多數人會直接使用“/”。

          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參數),使得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 閱讀(7220) 評論(1)  編輯  收藏 所屬分類: java

          Feedback

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

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

          主站蜘蛛池模板: 昌邑市| 额敏县| 彭泽县| 杨浦区| 扬州市| 达尔| 漳州市| 景泰县| 天津市| 金湖县| 万宁市| 东乌珠穆沁旗| 绥阳县| 嘉定区| 兴安盟| 余干县| 定南县| 广丰县| 枣阳市| 同江市| 郁南县| 山东| 朝阳区| 麻栗坡县| 天水市| 湖北省| 龙江县| 志丹县| 嘉禾县| 鄱阳县| 灵璧县| 栾城县| 灵川县| 桦甸市| 定边县| 兴海县| 来安县| 那坡县| 玉门市| 鄯善县| 哈尔滨市|