1

我尝试使从服务器端(在 Java 中)生成的 cookie 值与从这个jquery 的 cookie 库生成的 cookie 值相同,它使用:

encodeURIComponent( value )

对 cookie 值进行编码。

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

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

我在 Java 中使用此代码对 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*~'"()!±

关于如何生成完全相同的值的任何想法?你如何处理这个问题?

4

1 回答 1

1

这是我找到的修复:

我没有找到任何方法告诉 Java 停止添加这些双引号,所以我不得不忍受它们。

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

value = decodeURIComponent( pair[1] );

它用:

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

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

于 2012-08-21T00:13:10.260 回答