github
地址:戳这里
session
概念
- 指一类用来在客户端与服务器之间保持状态的解决方案
- 这种解决方案的存储结构
特点
由于
Session
是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。(也可以用其他存储方式比如redis
)Session
对象是有生命周期的Session
实例是轻量级的,所谓轻量级:是指他的创建和删除不需要消耗太多资源Session
对象内部有一个缓存
用法
Session
对象存储特定用户会话所需的属性及配置信息,在web
页跳转时,信息将不会丢失
通常用于以下操作
- 存储整个会话过程中保持用户状态的信息,比如登录信息或者用户浏览时产生的其它信息
- 存储只需要在 页重新加载 过程中,或者 一组功能页 之间保持状态的对象
- 在 Web服务器上保持用户的 状态信息 供在任何时间从任何设备上的页面进行访问。
限制
- 用户登录越多,
session
需要的内存量越大 - 每个
Session
对象的持续时间是用户访问的时间加上不活动的时间。
为何需要session
HTTP协议本身是无状态的
举个喝咖啡的例子:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。
具体机制
- 当程序需要为某个客户端的请求创建一个
session
的时候,服务器首先检查这个客户端的请求里是否已包含了一个 session标识 - 称为session id
,如果已包含一个session id
则说明以前已经为此客户端创建过session,服务器就按照session id
把这个session
检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id
,则为此客户端创建一个session
并且生成一个与此session
相关联的session id
,session id
的值应该是一个 既不会重复,又不容易被找到规律以仿造的字符串 ,这个session id
将被在本次响应中返回给客户端保存。 由于
cookie
可以被人为的禁止,必须有其他机制以便在cookie
被禁止时仍然能够把session id
传递回服务器。经常被使用的一种技术叫做URL
重写两种形式:
// 作为url附加路径 'http://..../xxx;jsessionid=abcdefjijeoijoifjioe' // 作为查询字符串 'http://..../xxx?jsessionid=abcdefjijeoijoifjioe'
较老的技术,表单隐藏字段,此方法在防止csrf中有用
实现
基于cookie来实现用户和数据的映射
将口令放在cookie
中,口令一旦被褚昂爱,就丢失映射关系。通常session
的有效期通常短,过期就将数据删除
一旦服务器检查到用户请求cookie
中没有携带session_id
,它会为之生成一个值,这个值是唯一且不重复的值,并设定超时时间。如果过期就重新生成,如