【发布时间】:2010-12-04 15:24:42
【问题描述】:
您应该如何编码 Java Cookie 对象的实际值?我无法传递“=”之类的字符或 US-ASCII 以外的任何字符。
/Br 乔恩斯
【问题讨论】:
您应该如何编码 Java Cookie 对象的实际值?我无法传递“=”之类的字符或 US-ASCII 以外的任何字符。
/Br 乔恩斯
【问题讨论】:
如何做并不重要,但通常Base64 应该可以正常工作。
注意事项:
这听起来像是您想在 cookie 中存储任意设置。这通常不是一个好主意,因为 cookie(就像所有客户端输入一样)是不受信任的。考虑将数据服务器端存储在某个生成的(随机!)标识符下,并将其放入 cookie 中。这样一来,人们就无法绕过访问限制或通过操纵 cookie 将任意数据注入您的系统。
如果您不能使用此方法,请将 cookie 值视为不受信任的输入并照常进行验证。
编辑:
Base64 不合适,因为它使用 Java cookie 不支持的“=”。而是使用
java.net.URLEncoder.encode
只使用适合 cookie 的字符。
【讨论】:
如果您有不安全的字符,请使用十六进制或 URL 安全版本的 Base64 对其进行编码。常规 Base64 不能用作 cookie 值。旧的 Tomcat 过去允许在其中使用非法字符,例如“=”,但新版本现在开始强制执行 cookie 规则。
【讨论】:
我最终使用了没有填充的 Base64 编码。这意味着后面的等号被省略了,这样问题就解决了。
创建一个无填充的 Base64 编码器java.util.Base64.getEncoder().withoutPadding()
创建一个无填充的 Base64 解码器java.util.Base64.getDecoder()
【讨论】:
据我了解,您需要这样的字符串 name="Женя";Cookie cookie=new Cookie("name",new String(name.getBytes("cp1251"),"utf8"));response.addCookie(饼干);
【讨论】:
我的 php cookie 值编码函数:
<?
function encode_cookie_value($value)
{return strtr($value,
array_combine(str_split($tmp=",; \t\r\n\013\014"),
array_map('rawurlencode', str_split($tmp))
)
);
}
setrawcookie('kk', encode_cookie_value('jk=jk?jk-/":jk;jk jk,jk'));
?>
【讨论】: