目录
1.session是什么?
在计算机中,尤其是在网络应用中,称为“会话控制”。session 对象存储特定用户会话所需的属性及配置信息,保存的位置是在服务端。说白了session就是一种可以维持服务器端的数据存储技术。
2.为什么使用session?
我们目前使用的互联网应用层协议基本上都是基于 HTTP 和 HTTPS 的,它们的本身是无状态的, 只负责请求和响应。但现在还需要用户能够登录,可以在论坛发帖子,在购物网站买东西等等。 这就需要 HTTP 协议能够记录用户的状态,在诸多请求中识别出是哪个用户。所以需要用用到session会话技术。
3.cookie是什么?
cookie是用来存储在客户端浏览器中的一种key-value的数据存储格式的文本文件。
这是一个请求发送的cookie,有如图以下属性:
cookie属性释义:
属性 | 介绍 |
---|---|
Name | name字段为一个cookie的名称 |
Value | value字段为一个cookie的值 |
Domain | cookie的域名。如果设成.test.com,那么子域名a.test.com和b.test.com,都可以使用.test.com的cookie |
Path | 可以访问此cookie的页面路径 |
Expires/Max-Age | 此cookie超时时间,不设置,则为Session会话期,关闭页面,cookie失效 |
Size | 此cookie大小 |
HttpOnly | 设置为true,则js读取不到cookie |
Secure | 标记为Secure的cookie,只能通过https请求发送 |
SameSite | 限制第三方cookie。有3个值:Strict/Lax/None Strict: 仅允许发送同站点请求的的cookie |
SameParty | 开启了 First-Party Sets 域名下需要共享的 Cookie 都需要增加 SameParty |
Priority | 优先级,chrome的提案,定义了三种优先级,Low/Medium/High,当cookie数量超出时,低优先级的cookie会被优先清除 |
4.为什么使用cookie?cookie与session的联系?
session的创建目的初衷就是为了让服务端记住会话,简而言之就是让服务端能识别出来是哪个客户端,既然要记住,那服务端必须要存储每个会话的数据,比如:实际项目中最常用的用户信息等。服务端存储这些用户数据没问题,最大的一个障碍是怎么样识别诸多请求中哪些是同一个会话。要解决这个问题,只依靠服务端无法解决,必须需要客户端来配合:需要上传会话的标识。
客户端上传会话的标识,必须是客户端和服务端都能支持的协议和数据,其实也可以看做是http请求支持的协议和数据,既然是基于http请求,最方便的就是利用cookie,cookie是一种key-value的数据存储格式,value的值正适合作为session的标识(session也是一种key-value的存储),在这种情况下cookie终于和session有了一定的联系。
session机制利用cookie来作为标识的传输机制,并不意味着只能用cookie,只要是服务端和客户端约定好了位置,session标识我可以放到http请求的任何位置(当然http请求必须得支持传输才可以)。你完全可以把session的标识放到http头Authorization字段,只要服务端能正确的读到此值并且正确解析即可。
5.cookie与session的区别?
- 存储用户信息的位置不同:Cookie保存用户信息的位置是客户端浏览器,Session保存用户信息的位置是服务端
- 安全性不同:Session保存用户信息的位置是服务端,它很难被修改,Cookie因为是保存在客户端,容易被截取和篡改,安全性不及Session。
- 还是基于Session保存信息在服务器上,要是访问量增多的时候,会消耗服务器的资源。Cookie则不会。
- 在保存重要信息的时候我们考虑用Session,其他不重要的信息时用Cookie
6.cookie与session的交互过程?
当客户端第一次request server发送请求时,server 产生 JSESSIONID 对应的值1,通过 http header set-cookie
,传递给 browser,browser 检测到 http response header 里带 set-cookie
,那么 browser 就会 create 一个 cookie,key=JSESSIONID,value=值1
,而后的每次请求,browser 都会把 cookie 里的键值对,放到 http request header 里,传递给 server。
当在 server 端调用 http.getSession() 方法时,server 会先从 http request header 里解析出来 JSESSIONID 的值,再从一个 Map 容器里去找有没有 value,如果没有,就会产生一个 HttpSessioon 对象,放到这个 Map 容器里,同时设置一个最大生存时间。HttpSession 你也可以把它想象成是一个 Map,可以 getAttribute(),可以 setAttribute()。