gpt4 book ai didi

servlets - ServletExec 中的 cookie 值缺少双引号和尾随等号

转载 作者:行者123 更新时间:2023-12-02 18:59:08 25 4
gpt4 key购买 nike

我有一个servlet应用程序,它将cookie存储为base64编码的字符串。在应用程序在 ServletExec 上运行的服务器上,cookie 的值不会用引号引起来。此外,如果值以“=”字符结尾,则该字符将被删除。缺少引号和尾随“=”会阻止正确解析 cookie 的值。在该应用程序在 ServletExec 和 Tomcat 上运行的另外 2 个服务器中,该应用程序在该服务器上运行,cookie 用双引号引起来,并且尾随的“=”符号不会被删除。

如浏览器的开发工具中所示:

坏 - cookiename:dGVzdHN0cmluZzE

预期 - cookiename:"dGVzdHN0cmluZzE="

知道什么是去掉引号和结尾的“=”符号吗? TIA!

最佳答案

默认情况下,Servlet Cookie 类遵循 Version 0 cookie spec 。这是 javadoc 的引用:

This class supports both the Version 0 (by Netscape) and Version 1 (by RFC 2109) cookie specifications. By default, cookies are created using Version 0 to ensure the best interoperability.

版本 0 cookie 值对允许的字符有限制。它只允许 URL 安全字符。其中涵盖字母数字字符(a-z、A-Z 和 0-9)以及少数词汇字符,包括 -_~%。所有其他字符在版本 0 cookie 中均无效,包括 "=。如果服务器尚未执行此操作,浏览器将吞掉无效字符。

最好的办法是对这些字符进行 URL 编码。这样,URL 中不允许的每个字符都将以 %xx 形式进行百分比编码,该形式作为 cookie 值有效。

因此,在创建 cookie 时执行以下操作:

Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
// ...

读取 cookie 时,执行以下操作:

String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
// ...

另一种方法是通过 Cookie#setVersion() 切换到版本 1 cookie,但这在 IE<=11 中不受支持。

关于servlets - ServletExec 中的 cookie 值缺少双引号和尾随等号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com