前几天在记录用户信息时用到了cookie,由于cookie在写用户信息时含有特殊字符@,由于需求明确要求用户名带有@,纠结了一番。其实有个最好的解决方案,就是通过URLEncode来进行编码,在客户端可以通过URLDecode进行解码,由于用此方案需要各个模块改的东西比较多,网站其它模块依赖用户中心写用户信息的api,此动作需要涉及其它部门协调修改,最终没有使用这个方案。最后从头开始对cookie研究了一番,首先介绍一下cookie的一些基本信息。
Cookie概念:
Cookie的格式实际上是一段纯文本信息, 由服务器随着网页一起发送到客户端, 并保存在客户端硬盘中指定的目录的. 大家都传说Cookie会造成严重的安全威胁什么的,
其实不是这么回事情. 服务器读取Cookie的时候, 只能够读取到这个服务器相关的信息.。
而且, 浏览器一般只允许存放300个Cookie, 每个站点最多存放20个, 而且, 每个Cookie的大小现在在4K, 根本不会占用多少空间。并且 Cookie是有时效性质的. 例如, 设置了Cookie的存活时间为1分钟, 则一分钟后这个Cookie就会被浏览器删除。
Cookie版本:
目前有两个版本:
版本0 : 由Netscape公司制定的,也被几乎所有的浏览器支持. Java中为了保持兼容性, 目前只支持到版本0, Cookie的内容中不能空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号。
版本1 : 根据RFC 2109(http://www.ietf.org/rfc/rfc2109.txt)文档制定的. 放宽了很多限制. 上面所限制的字符都可以使用. 但为了保持兼容性, 应该尽量避免使用这些特殊字符。
由于线上运行的tomcat服务器的版本是6.0.29,在写入cookie后,发现含有特殊字符@的用户名自动被tomcat加了两个双引号,tomcat6.0.16版本以下的tomcat不会存在以上问题。
在反复纠结后最终决定在http的header里写入带有@的用户名,通过方法request.addHeader("set-Cookie","name=xxx;value=123@163.com;"),发现cookie确实被写成功了且没有双引号,但是通过request.getCookie*()获取cookie时发现读取
的信息的不全了,比如cookie的值是123@163.com 使用request.getCookies()获取cookie的值得到的是123,而@符号后面的就没了。在tomcattomcat6.0.16版本以下不存在上述问题,读写含有@的cookie信息时正常的。
于是看了大体看了一下tomcat关于cookie的处理。
我首先选择了tomcat6.0.29的源码。org.apache.tomcat.util.http.Cookies的定义了一个特殊字符常量。
public static final char[] SEPARATORS = { '\t', ' ', '"', '(', ')', ',', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '{', '}' };
org.apache.tomcat.util.http.ServerCookie定义了如下变量和方法判断是否是非法字符。
private static final String tspecials2 = "()<>@,;:\\\"/[]?={} \t";
public static boolean isToken2(String value, String literals) {
String tspecials2 = literals == null ? "()<>@,;:\\\"/[]?={} \t" : literals;
if (value == null) return true;
int len = value.length();
for (int i = 0; i < len; i++) {
char c = value.charAt(i);
if (tspecials2.indexOf(c) != -1)
return false;
}
return true;
}
再具体看一下tomcat6.0.14版本对cookie的特殊字符的处理。org.apache.tomcat.util.http.ServerCookie定义了如下方法判断是否是非法字符。
public static boolean isToken2(String value) {
if (value == null) return true;
int len = value.length();
for (int i = 0; i < len; i++) {
char c = value.charAt(i);
if ((c < ' ') || (c >= '') || (",; \"".indexOf(c) != -1))
return false;
}
return true;
}
通过源码对比发现两个版本对cookie的特殊字符处理不同,导致了以上问题。所以在处理含有特殊字符的cookie时,最佳的解决方案是通过URL编码,js进行解码。
简要介绍一下js进行编码、解码通常的方法:
encodeURI() 函数可把字符串作为 URI 进行编码。该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。 该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#。如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码,此方法的解码为decodeURI()。
escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换, 可以使用 unescape() 对 escape() 编码的字符串进行解码。
encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。 其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的,此方法解码方式decodeURIComponent。
最好介绍一下cookie的生命周期,cookie的生命周期通常可以用cookie.setMaxAge(time)来的设定,time<0表示当前浏览器生效,time=0清除当前cookie,time>0表示当前cookie的
时间单位为秒。但是在不同的tomcat版本和浏览器会有不同的情况,当TOMCAT服务器是6.0.16及一下版本时,则不支持含有特殊符号的cookie值,这样的cookie存储在浏览器全部关闭就就会失效。
TOMCAT版本都是5.5,所以在IE下设置cookie值时,如果设置了version为1或者cookie中含有特殊符号,则存储的cookie不管是否设置了失效时间,都会在浏览器关闭后自动失效。
分享到:
相关推荐
### Extjs 中关于 Cookie 的操作 #### 一、引言 在 Web 开发中,Cookie 是一种常用的数据存储方式,用于保存用户的一些基本信息或者状态,从而实现网站的个性化设置或登录状态保持等功能。Extjs 作为一种强大的 ...
关于Cookie有效期.txt
这是php中的一个关于cookie 的应用,在php中传入cs的变量值
Java小技巧:关于Cookie的操作.txt
在JavaScript中,Cookie是用于在用户浏览器中存储小量数据的一种机制。它们是HTTP协议的一部分,主要用于跟踪用户会话、存储用户首选项或保存登录状态。Cookie由服务器生成,并通过HTTP响应头发送到浏览器,浏览器在...
此外还可以直接通过`header()`函数发送`Set-Cookie`响应头来设置Cookie。 ##### 使用`setcookie()`函数 `setcookie()`函数的基本语法如下: ```php bool setcookie ( string $name [, string $value [, int $...
标题中的“cookie”一词指的是Web...以上是关于Cookie技术的基本介绍,具体实现细节和使用技巧可能需要参考原文档或“cookie.jsp”文件的内容。对于开发者来说,理解和熟练使用Cookie是构建高效、安全的Web应用的基础。
标题“使用Cookie记录用户名和密码”涉及到的是Web开发中的用户会话管理技术,特别是关于Cookie的应用。Cookie是一种在客户端和服务器之间传递信息的小型文本文件,常用于保持用户登录状态、存储用户偏好设置等。在...
8. **教育功能**:Cookie Pal还可能包含关于Cookie工作原理、隐私风险以及如何安全使用网络的教育资源,帮助用户提升网络安全意识。 了解并掌握Cookie Pal的使用,不仅有助于提升在线浏览的安全性和效率,还能让...
在Web开发中,数据存储是不可或缺的一部分,尤其是...对于学习和实践,"CookieTest"这个文件名可能包含了一些关于Cookie测试的代码示例,通过查看和分析这些代码,可以进一步加深对Cookie和localStorage的理解和运用。
用户可以访问该网站获取更多关于Cookie管理和清理的资源和信息。 6. **注意事项**: - 清理Cookie可能会影响某些网站的正常功能,如自动登录、购物车状态等。 - 不是所有Cookie都是有害的,适度管理以平衡便利性...
在Java编程中,Cookie是一种非常重要的技术,它用于在客户端和服务器之间传递信息,尤其是在实现用户会话管理、个性化设置等方面。...通过不断实践和深入学习,开发者可以掌握更多关于Cookie和Web开发的高级技巧。
今天有同事又问起关于cookie的问题,我就到网上查询了一下做了一些相关的摘要记录下来,以备不时之用。关于cookie的操作,做为JS程序员应该是相对熟悉一些的,所以就不对它进行过多的说明了。 以下就是关于各...
ISAPI开发者需要理解HTTP协议,特别是关于Cookie的规范,以便正确地设置和读取Cookie。 在实际开发中,除了基本的Cookie操作,还可能需要处理其他复杂情况,如处理多个Cookie、考虑安全性(如防止跨站脚本攻击XSS)...
在Spring Boot应用中,登录验证通常涉及到Cookie和Session两种技术,它们都是用于用户身份验证和会话管理的重要手段。本文将深入探讨如何在Spring Boot中使用Cookie和Session进行登录后的拦截处理。 首先,简单介绍...
**关于Cookie的解释**: Cookie,通常称为"小甜饼",是由服务器发送到用户的浏览器并存储在本地的一小段文本数据。它们被用来追踪用户的在线行为,比如保持登录状态、记录购物车内容或者个性化网站体验。第一方...
关于Cookie的设置,Cookie是Web服务器存储在用户浏览器中的小数据块,常用于会话管理、个性化设置等。当处理跨域请求时,有些情况下可能需要传递Cookie。默认情况下,浏览器只会发送同源的Cookie。如果需要在跨域...
"cookie_demo2.zip"这个压缩包文件似乎包含了一个关于Cookie使用的示例,特别是关注于Cookie的生命周期。接下来,我们将深入探讨Cookie、Session以及它们生命周期的相关知识点。 **1. Cookie的基本概念** Cookie是...
Cookie是Web应用程序中用于管理用户会话和存储用户...通过深入阅读“Cookie相关PDF文档”,你可以获得关于Cookie的全面理解,包括其工作原理、最佳实践、安全考虑和隐私法规,以及如何在实际项目中有效地应用Cookie。