按照正常的逻辑,在禁用浏览器的Cookies后,或者客户端清理Cookies后,我们服务端的Session使用是会受影响的。
禁用Cookies时,Session也不可用,通过GET等方式提交SessionId时,也会受到标签页关闭影响而消失。
清理Cookies后,我们就会丢失之前用户的Session信息。
那么,禁用或清理Cookies后就真的没什么好办法么???
其实是有的,我这里写了个简单的例子,证明禁用或清理Cookies后,重新访问页面依然可以恢复原有的Session Id。
在这个页面,你可以尝试禁用浏览器Cookies或者清理Cookies,刷新页面后,依然是原来的Session Id。
其实具体原理还是很简单的,利用浏览器缓存更新时的ETag特性做为用户识别关键。
加载一个固定地址的JS,JS在第一次加载的时候,会向客户端输出ETag头信息。
那么在再次访问时,客户端会携带 If-None-Match 头信息请求。
而If-None-Match的值就是先前ETag输出的值,原意是用来服务器校验文件是否被修改。
如果文件未修改,就返回304状态码,客户端就不会继续请求剩下的内容。
而这个是不需要依赖Cookies的,所以我们可以把用户的Session储存在ETag中。
每次打开的时候,通过这个JS向页面写出当前用户Session Id的变量。
就实现了,清除Cookies后依然能获取到用户Session Id。
当然,由于是依赖的缓存,如果用户清理了浏览器缓存或者强制刷新页面,依然没啥卵用。
所以,只是演示示例,并不具有实用价值。
至于如何实现禁用Cookies时首次页面向JS传递ID。
我是这样解决的,页面加载JS时,把生成的Session Id写到对应的script标签的data上。
JS首次加载如果没获取到ETag会尝试从自身的data-session-id获取,并通过Ajax的头信息提交到服务器上。
这样,即可实现彻底禁用Cookies依然可用。
谢谢,好文章,非常喜欢。
谢谢
大佬,我博客前台和后台无法传递Session,能不能指点下
建议使用GET 或者使用同域名的sonp
是 jsonp