Cookie
概念
Cookie全称是HTTP Cookie,是一种在客户端保存数据的技术,以键值对的形式存储在客户端。
Cookie可以分为内存cookie和磁盘cookie。内存cookie在浏览器关闭后消失,磁盘cookie超时后消失。当浏览器发送请求时,将自动发送对应cookie信息,前提是请求url满足cookie路径
特点
按照域名存储
,你在哪一个域名下存储的内容, 就在哪一个域名下使用, 其他域名都用不了, 和资源路径地址没有关系。
注意: 127.0.0.1 和 localhost 不同
2. 存储大小有限制
,4KB 左右或者50 条左右。
3. 时效性
,默认是会话级别的时效性(关闭浏览器就没有了),设置存活时间后会保存到硬盘,可以手动设置。
4. 请求自动携带
,当你的 cookie 空间里面有内容的时候,只要是当前域名下的任意一个请求, 都会自动携带 cookie 放在请求头里面, cookie 里面有多少自动携带多少,没有就不会携带了。
5. 前后端操作
,前端可以通过 js 操作 cookie 空间进行增删改查,后端也可以通过任何后端语言进行 cookie 空间的增删改查。
6. Cookie不能跨域
,我们Cookie的domain属性是sso.a.com,在给app1.a.com和app2.a.com发送请求是带不上的。
属性
name
名称,一旦创建,名称便不可更改value
值,如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码maxAge
失效的时间,单位秒。正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临- Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为-1。
signed
所请求的cookie应该被签名expires
cookie 过期的 Datepath
cookie 路径, 如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。默认是’/’,domain
cookie 域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。secure
是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。httpOnly
设置为true,则服务器可访问 cookie, 浏览器js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。默认是 trueoverwrite
一个布尔值,表示是否覆盖以前设置的同名的 cookie (默认是 false). 如果是 true, 在同一个请求中设置相同名称的所有 Cookie(不管路径或域)是否在设置此Cookie 时从 Set-Cookie 消息头中过滤掉。comment
用处说明
session
概念
Session字面含义就是会话。由于HTTP是无状态协议,为了保持浏览器与服务器之间的联系,才有了Session。Session就是用于在服务器端保存用户状态的协议。通常用来保存用户的登录状态。
服务端(Tomcat等)专门开辟一块内存来保存session,默认有效时间为30分钟
,每个session都有一个唯一的sessionId,默认保存在cookie中,禁用Cookie就使用url重写,把sessionId加在url路径。
流程
当用户发送一个请求到服务器端时,服务器会先检查请求中是否含有sessionid(存在cookie中或者在url中)
- 如果不存在,说明是第一次请求,就会为该请求创建一个session对象,并将sessionid放到响应头的set-cookie中,格式set-cookie:sessionid,下次再请求时cookie中就会有一个name为jsessionid的cookie,value就是sessionid。
- 如果存在sessionid,就会在服务器查找是否有该sessionid对应的session,如果有就使用,没有就创建一个。
客户端与服务端第一次会话
时:服务端会将sessionId放到响应头的set-cookie中
。
注意: 第一次会话是指:当后端接口请求参数有HttpSession
或者后端创建HttpSession
对象时,服务端会将sessionId
放到响应头的set-cookie
中
第二次会话时:客户端会携带了第一次收到的sessionid,客户端会将所有的Cookie信息全部携带
对象 | 职责 |
---|---|
SessionId | 负责标识客户端/用户 |
HTTP | 负责传递SessionId |
Cookie | 负责保存SessionId |
服务器 | 负责保存Session内容 |
分布式部署问题
分布式部署时,使用session会有问题
- 粘性session:有一个ip来了,分给一个服务器处理,下次相同的ip来访问,还是使用相同的服务器处理,这样就能使用上次的session。但是会有问题,负载不均衡
- 同步session:有一个服务器创建了session,同步给其他的服务器。这样服务器之间会产生关联
- 共享session:用一台服务器专门用来存储session,其他的服务器都向该服务器获取session。但是如果该服务器挂了,就gg
- 存到数据库,所有的服务器都访问数据库redis,得到会话的数据。数据库做一个集群,主从备份,不怕宕机