Cookie与Session

173 阅读4分钟

Cookie概述

Cookie是存储在浏览器的一小段文本信息,一般大小不能超过4KB。浏览器向服务器发出请求,会自动携带
上cookie信息。

Cookie工作原理

1.浏览器第一次请求服务器。
2.服务器端创建Cookie,并将Cookie发送到浏览器端。
3.浏览器再次访问服务器端,会携带上Cookie信息。

*注意:服务器在创建Cookie时,一般存储的都是用户的标识ID,也就是sessionId,后续浏览器访问服务器,
通过Cookie里携带的sessionId来验证访问的用户。

Cookie的元数据

每个Cookie都有以下几方面的元数据:
1.Cookie名字
2.Cookie3.到期时间
4.所属域名
5.生效的路径

举例:
当用户访问www.hello.com,服务器在浏览器写入一个Cookie。这个Cookie的所属域名为www.hello.com,
生效路径为根路径/。如果Cookie的生效路径设为/oList,那么这个Cookie只有在访问www.hello.com/oList
及其子路径时才有效。浏览器访问某个请求之前,就会找出该请求有效,并且还没到期的Cookie一起发送给服务器。

image.png

Expires/Max-Age

Expires属性指定一个具体的到期时间,到了指定时间后,浏览器将不再保留这个Cookie信息。
如果不设置该属性,或者设为nullCookie只在当前会话(session)有效,浏览器窗口一旦关闭,当前 
Session结束,该Cookie就会被删除。

注意:
浏览器根据本地时间,决定Cookie是否过期,由于本地时间是不精确的,所以没有办法保证Cookie一定
会在服务器指定的时间过期。

Max-Age属性表示从现在开始Cookie存在的秒数,比如60*60*24*365(即一年)。过了这个时间浏览器就不再
保留这个Cookie。如果同时指定了ExpiresMax-Age,那么Max-Age的值将优先生效。

Domain

Domain属性表示浏览器发出HTTP请求时,哪些域名要携带Cookie

Path

Path属性指浏览器发出HTTP请求时,哪些路径要携带Cookie。只要浏览器发现,Path属性是HTTP请求路径的开
头一部分,就会在头信息里面带上这个Cookie。比如,PATH属性是/,那么请求/docs路径也会包含该Cookie。
当然前提是域名必须一致。

Secure

Secure属性指浏览器只有在加密协议HTTPS下,才能将Cookie发送到服务器。另一方面,如果当前协
议是HTTP,浏览器会自动忽略服务器发来的Secure属性。该属性只是一个开关,不需要指定值。如果通信
是HTTPS协议,该开关自动打开。

HttpOnly

HttpOnly属性表示Cookie无法通过JavaScript脚本拿到,主要是document.cookie属性、XMLHttpRequest对
象和Request API都拿不到该属性。这样就防止了Cookie被脚本读到,只有浏览器发出HTTP请求时,才会带
上Cookie

Cookie的应用场景

1.会话登录
判断用户是否登陆过网站,以便下次登录时能够直接登录。

2.购物车信息
用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,
在最后付款时从cookie中提取这些信息。

...
...

cookie的应用场景还有很多,具体就要结合自己的业务来使用。目前最常见的是cookie和session结合使用。
因为我们知道cookie是存储在客户端的,那么便会有这个安全性问题,用户可以随意篡改cookie中的信息,
所以cookie一般不会存储敏感信息(如卡号、钱、身份证号等等),并且cookie存储大小不超过4KB,
这也就限制了cookie不能存放大量数据。那么这个时候就要用到session了,将这些敏感数据存放到session
中,cookie只保存这个session的id,每次请求只需要将sessionId携带过来,便可以拿到这个用户信息。

Session概述

session也是一种会话机制,只不过session是保存在服务器端的。服务器一般把Session放在内存里,为了
更高的存取速度,因此,Session里的信息应该尽量精简。

注意:
1.tomcat中session默认存储为30分钟,如果过了超时时间Session就自动失效了。
2.Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSPServlet等程序时才会
创建Session,只访问HTMLIMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以
使用request.getSession(true)强制生成Session