cookie真的只和浏览器有关么?

今天写js的时候,写了段大致为

document.cookie = "键名=键值";

的代码,向cookie里放入中文,然后刷新页面时,奇怪的事情发生了

tomcat报错;

Error processing request
java.lang.IllegalArgumentException: Control character in cookie value or attribute.
at org.apache.tomcat.util.http.CookieSupport.isHttpSeparator(CookieSupport.java:193)
at org.apache.tomcat.util.http.Cookies.processCookieHeader(Cookies.java:272)
at org.apache.tomcat.util.http.Cookies.processCookies(Cookies.java:168)
...

查了很多资料,发现这是tomcat7的一个bug,不支持含有中文cookie

这让我百思不得其解,为什么我在客户端体存取cookie会造成服务器上的错误,难道操作cookie不是浏览器自己的事吗?

到处翻资料...

cookie和session的概念在刚接触网站开发的时候老师就三令五申,大家不论用不用也大致对这两者有个概念:

cookie存储在浏览器中,由客户端维护;session存储在服务器中,由服务器维护。

这概念没有问题,但是容易让人误解为:cookie与服务器没关系,session与浏览器没关系。


实际上,如果你不做特别设置,每次浏览器的request请求都会在header里带上cookie信息,具体可以参考下面这段引用:

/*

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScriptt也可以生成cookie。

而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

原文地址:http://tigerlchen.iteye.com/blog/1808163

*/

也就是说,在会话之初,服务器生成sessionID作为令牌给浏览器用做身份证明,而浏览器据此生成cookie,并记录发证的服务器是谁,而后在每次会话的时候,一旦浏览器确认是发证方的会话,就会带上对应cookie内的信息一起给服务器。这就解释了为何我在cookie里放中文会让tomcat报错。


(由于这个误解,以前学java的时候还以为从request里取到的cookies只是服务器的某个全局缓存。。。面壁)


希望能对和我一样的小白有所帮助~





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值