根据RFC 2109,Cookie的值对用户代理不透明,可能是源服务器选择发送的任何内容,可能是服务器选择的可打印ASCII编码。在C#中处理编码的cookie值
因此,即使原始值相同,不同的语言/平台/服务器也会发送不同的cookie值。
例如,C#/ ASP.NET按原样发送文本;经典的ASP urlencodes和urldecodes文本; Perl/Apache urlencodes /解码文本(但与ASP不同!)。 Php给你的选择。
我在写一个单一登录系统,需要与非常不同的应用程序共享一个cookie。特别是我有需要立即支持的.NET,Java,Perl,ColdFusion。
我在cookie中存储的文本始终是有效的ASCII-7字符串。不过,例如,Perl喜欢编码一些7位ASCII字符。
我看到两个主要备选方案,以使这项工作:
只接受非编码的值。毕竟没有必要对它们进行编码。这是目前的情况。显然,所有集成系统必须能够支持非编码值。
接受编码值和非编码值。这将允许出现最大的兼容性,但我需要确定一个特定的值是否被编码(这听起来是不可能的:字符“%20”字符串或空格是“%20”?)
您会建议哪种解决方案?为什么?如果它是#2,你会如何检测UrlEncoded文本?
一个cookie的例子(我已经添加了换行符,使其适合)
A5A2794D694241AD92F9B22F288EFAA1|8428DCCC|20090821142732|20090821142832|
10.100.107.40|955098D50AB4982D4E247EFA53F4E23B32A05ED0131E096709BE1D8CCC
8A3CA18252D376473C244FD71C462AB42CF54C
我已经在使用HEX。唯一的非字母数字是用于分隔字段的管道字符 - 这就是perl编码的内容。另一方面,任何字符都可以编码为我在其他平台下知道的所有字符。你永远不知道:) – Sklivvz 2009-08-21 14:25:52
我想如果你坚持字母数字,它会没事的。只需使用X作为分隔符而不是|。 – 2009-08-21 14:27:42