很多同学在做web开发时总是对session和cookie犯迷糊,今天分析下cookies和seesion的生命周期和区别,加深下对
cookie和session的了解和认识。
cookies和session都可以理解为存储用户信息的一个存储机制,不过一个是信息存储在客户端一个存储在服务端。
cookie在我们的日常中也很常见,比如我们在淘宝搜索过某些内容,后期总会收到一些淘宝的相关内容的推送信息,因为获取到了我们的cookie中的内容,就会针对的推送相关的信息。我们理解的广义的cookie分发是通过扩展HTTP协议来实现的。
实现过程:
用户通过浏览器发送请求后,在服务端生成私人数据cookie,存储些用户发送过的信息或者自定义的信息,通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,存储在浏览器的内存中,下次再发送请求时,由浏览器按照一定的原则在浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上自动发送给服务器。cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,cookie存储在浏览器内存上,存储这个cookie浏览器关闭时,则cookies自动销毁。而如果设置了过期时间,则保存在硬盘上,只要在有效期内访问都会有效,到期后自动销毁。
实现:
安全:不安全,但是可以使用时可加密处理改进;
销毁:未设置有效期时,浏览器关闭,自动销毁,设置有效期后,有效期时间累积到到时间后自动销毁。如设置10分钟,十分钟后时间到大自动销毁;
共享:保存在浏览器内存中时只能同一个浏览器窗口使用,而保存在多个硬盘上,多个浏览器窗口可以共享;
优点:不占服务端内存,存储在浏览器上有一定的保密性;
缺点:1、保存的数据只能是String类型,无法保存复杂类型;
2、存储在浏览器内存上很容易被回收,导致无法获取到数据。
session可以理解将数据存储在服务端,常见就是我们所说的会话。
实现过程:
用户第一次访问时根据用户需求,在服务端开辟一块内存session保存用户私人信息,然后将这块内存的sessionid发送通过cookie文件发送给浏览器,该cookie保存在浏览器内存中,也就是所说的会话cookie,用户关闭浏览器,则会话cookie销毁,用户使用浏览器再次发送请求时,会自动将内存的id发送给服务器,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id。session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。当然cookies也可以设置存活周期,但是cookies设置了存货周期就会存储在硬盘上,过期后自动销毁而session的生命周期在Tomcat关闭时,自动销毁session。
实现:
2、通过api设置空闲时间,针对具体的内存来设置
存储:web服务器上
安全:存储在服务端不容易获取,安全性较高
销毁:达到设置空闲时间时,仍然没有访问则认为用户放弃了该session会自动注销该session,设置的空闲时间为重新计时如果设置为十分钟,空闲五分后有用户访问,则重新开始计时十分钟,在达到十分钟时还没有用户访问则该session就销毁了。Tomcat关闭时也销毁该session.
共享:具有相同的sessionid才可以访问