http协议是无状态的,cookies 与session 两者的出现都是为了维持浏览器端与服务器端的联系,毕竟服务器总要搞清楚来访问的是A客户端还是B客户端。而要让服务器搞清楚这点,总需访问者留点“痕迹”给服务器来判断。session与cookies的主要区别也就在这里:留下来的这个“痕迹”是保存在了客户端还是服务器端。
举个别人家例子:
一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保存状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保存状态。
Cookies
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
Session
当浏览器第一次请求时,服务器创建一个session对象,同时生成一个sessionId,并在此次响应中将sessionId 以响应报文的方式些回客户端浏览器内存或以重写url方式送回客户端,来保持整个会话。关闭此浏览器窗口,其内存中的sessionId也就随之销毁。重新请求时,会重新生成一个sessionId给客户端浏览器,并存在浏览内存中。
之前遇到了url中附带jsession字符串导致我的url rewrite正则式错误,就是源自session的机制
长相:www.zhihaoyu.com/blog/1;jsessionid
=
5F4771183629C9834F8382E23BE13C4C
原因:session机制的实现是需要cookie支持的,用于识别session的sessionid需要服务器返回给客户端并由客户端保存,以便下次客户端访问的时候识别身份。而这个sessionid是在cookie中保存的(区别是保存在内存中,并未写入到客户端磁盘上,因此关闭浏览器就会失效)。但是在某些情况下,比如浏览器禁用了cookie,这种情况下服务器端servlet的做法是将sessionid写入到url中然后返回给客户端(
不同的服务器做法可能是不一样的),客户端再发送请求的时候便会将sessionid附带上,就是所见的jsessionid那一大串。
一开始我urlrewrite的规则中直接屏蔽掉了jsessionid,这样子妨碍了session自身机制总归不好,后来还是加上去了。诸如:
<rule>
<from>^/(.*).html(;jsessionid=[a-zA-Z0-9]+)?$</from>
<to type="forward">/$1.action$2</to>
</rule>
假如用户屏蔽了cookie,会对网站访问造成什么影响呢,服务器是否会用相应办法解决session识别问题。
在chrome中关闭cookie
我试了好几家网站,发现但凡登录功能都不能用了,很多数据也解析不出来
这个本该有个id的,但获取不到。
上网查了下资料,对cookie的依赖仍是主流做法,现在的手机浏览器也大都是支持cookie。因此关于这一点在自己项目中不再做多考虑,如果用户当真屏蔽了cookie,可以返回个提示页面。