我尝试使从服务器端(在Java中)生成的cookie值与从此jquery's cookies librarie生成的cookie值相同,后者使用:

encodeURIComponent( value )


对Cookie值进行编码。

让我们以这个示例字符串为例:

a b,c;d*~'"()!±


我在Java中使用this code编码cookie值:

String result = URLEncoder.encode(str, "UTF-8")
                          .replaceAll("\\+", "%20")
                          .replaceAll("\\%21", "!")
                          .replaceAll("\\%27", "'")
                          .replaceAll("\\%28", "(")
                          .replaceAll("\\%29", ")")
                          .replaceAll("\\%7E", "~");


然后,我将cookie添加到响应中:

Cookie cookie = new Cookie("testCookieServerSide", encodeValue("a b,c;d*~'\"()!±"));
response.addCookie(cookie);


这会在值周围添加双引号! :

"a%20b%2Cc%3Bd*~'%22()!%C2%B1"


当使用jquery库编码相同的值时,我得到相同的值,但没有双引号:

a%20b%2Cc%3Bd*~'%22()!%C2%B1


是否可以告诉Java不生成双引号?我听说过cookie.setVersion(0)或cookie.setVersion(1),但这似乎没有任何改变。

在服务器端检索这两个值时,它们在a之后是相同的:

URLDecoder.decode(cookie.getValue(), "UTF-8");


...删除双引号。大。

但是在客户端,这两个值是不同的!

alert($.cookies.get('testCookieServerSide')); => "a b,c;d*~'"()!±"
alert($.cookies.get('testCookieClientSide')); => a b,c;d*~'"()!±


关于如何产生完全相同的值的任何想法吗?您如何处理?

最佳答案

这是我发现的解决方法:

我没有找到任何方法告诉Java停止添加这些双引号,因此我必须忍受它们。

我修改了我使用的jquery's cookies library,而不是像这样解码cookie值:

value = decodeURIComponent( pair[1] );


它用:

value = decodeURIComponent( pair[1].replace( /^"(.*)"$/, '$1' ) );


当到达这行代码时,cookie中的值仍然会被编码(js库本身在客户端对它进行编码,而我使用上述代码在服务器端使用Java对其进行编码)。因此,值的开头和结尾的双引号(如果未编码)一定是Java添加的字符...在获取值时必须将其删除。

09-10 01:09
查看更多