如何从Java和Javascript生成相同的cookie(不包含双引号)

如何从Java和Javascript生成相同的cookie(不包含双引号),java,javascript,cookies,urlencode,Java,Javascript,Cookies,Urlencode,我尝试使从服务器端(Java)生成的cookie值与由此生成的cookie值相同,这使用: encodeURIComponent( value ) 对cookie值进行编码 让我们以这个字符串为例: a b,c;d*~'"()!± 我使用Java对cookie值进行编码: String result = URLEncoder.encode(str, "UTF-8") .replaceAll("\\+", "%20")

我尝试使从服务器端(Java)生成的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);
这会在值周围添加双引号!:

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

a%20b%2Cc%3Bd*~'%22()!%C2%B1
可以告诉Java不要生成双引号吗?我听说过cookie.setVersion(0)或cookie.setVersion(1),但这似乎没有改变任何东西

在服务器端检索这两个值时,它们在以下情况下是相同的:

URLDecoder.decode(cookie.getValue(), "UTF-8");
。。。双引号将被删除。太好了

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


你知道如何产生完全相同的值吗?您如何处理此问题?

以下是我找到的修复方法:

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

我修改了我使用的cookie值,因此没有像这样解码cookie值:

value = decodeURIComponent( pair[1] );
它使用:

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

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

以下是我找到的修复方法:

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

我修改了我使用的cookie值,因此没有像这样解码cookie值:

value = decodeURIComponent( pair[1] );
它使用:

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

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

这是一个冒险,但是如果您尝试先对字符串值进行编码/解码(使用此处建议的函数:)会发生什么情况?我知道它很旧,但这就是我在javascript中模拟UTF8编码/解码的全部内容。Jeff,感谢您的帮助。问题不在于字符是如何编码的,这在两侧都是相同的。问题是Java在值的周围添加了额外的双引号(当有特殊字符时)。您可以在这里找到答案:[[1]:感谢您的评论robson。这是一个偶然的发现,但是如果您尝试先对字符串值进行编码/解码(使用此处建议的函数:),会发生什么情况我知道它很旧,但这就是我在javascript中模拟UTF8编码/解码所看到的一切。Jeff,谢谢你的帮助。问题不在于字符的编码方式,这在两侧都是相同的。问题是Java在值周围添加了额外的双引号(当有特殊字符时)。你可以在这里找到答案:[[1] :谢谢你的评论,罗布森。非常感谢,它帮助了我。:)非常感谢,它帮助了我。:)