Session与Cookie的概念原理
前言:
本文没有任何代码,内容全部都是概念与运行原理,在使用一个技术前一定要弄清他的本质,下面会讲Session、Cookie、ServletContext的概念与他们的联系区别
Session概念
1.Session是什么?
服务器开辟了一块空间专门存放Session,这个空间叫做Session池,Session池中可以存放多个Session,每个Session对应一个客户端(浏览器),比如你打开360浏览器与IE浏览器这就是2个客户端,此时在Session池中会存在360浏览器对应的Session与IE浏览器对应的Session,而每个客户端都会去找自己对应的Session。
2.Session能做什么?
上面说了Session是什么,但是它能做什么,Session主要做的事情就是存储资源(数据),因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户客户端(浏览器)对应的session中,当用户使用客户端(浏览器)访问服务器程序时,客户端(浏览器)对应的session中取出该用户的数据。
3.Session的获取流程原理图:
1.服务器中会有个专门储存Seesion的空间Seesion池
2.用户打开了一个浏览器发送请求访问项目
3.请求的时候,服务器会根据你这个客户端(浏览器)创建对应的Seesion在Session池中
从上图可以很明显的看出,获取Session不会受Servlet(服务连接器)影响,只会受客户端影响,Session与客户端是一对一的关系,你360浏览器的Session1数据你通过火狐浏览器肯定是取不到,火狐取的是自己对应的Session2,说到这里另一个问题出现了,服务器是怎么把客户端(浏览器)与Seesion对应起来的呢?在回答这个问题前先了解下Cookie吧
Cookie概念
1.Cookie是什么?
Cookie是客户端(浏览器)上储存数据的文件,是存放在客户端(浏览器)里面的。
2.Cookie能做什么?
存储数据,与Session不同的是,Session是存放在服务器上,Cookie是在存放在客户端,
每次客户端(浏览器)发送请求的时候,会把客户端(浏览器)里面所有的Cookiec都发送到服务器去,服务器响应回来的时候会把数据储存到Cookiec发送给客户端(浏览器),其中里面会储存SessionId,从而进行 session 跟踪,把客户端与Seesion关联起来。
3.Cookie的流程原理图
1.客户端(浏览器)发送请求时会把客户端里面所有的Cookie全部传到服务器
2.服务器接收到请求后,服务器响应客户端(浏览器),会把数据储存到Cookiec发送给客户端(浏览器),其中里面会储存SessionId
3.客户端(浏览器)接收到后又储存起来
4.每个客户端(浏览器)都会有属于自己的Cookie。
注:Cookie的生命周期默认是浏览器会话期间,浏览器关闭后,Cookie清空,除非你手动设置Cookie生命周期时间
Session与Cookie的联系、区别
Session与Cookie合并运行原理图:
1.首先客户端(浏览器)发送请求到服务器
2.请求里面会把客户端(浏览器)所有的Cookie带上
3.服务器接收到请求
4.内部开始处理,首先从客户端(浏览器)带过来的Cookie里面获取SessionID
5.拿SessionID去Session池中查询
6.如果没有查询到对应的Session或SessionID是空,重新新建一个Session到Session池中
7.如果查询到了直接获取对应Session
8.把数据存入客户端(浏览器)带过来的Cookie,其中就有SessionID,响应给客户端(浏览器)
9.客户端得到响应并把Cookie储存起来
10.接着从1-9循环
Session与Cookie的联系区别:
联系:客户端获取Session需要通过Cookie里面的SessionId,Cookie就是客户端与Session的中间桥梁。
区别:同样是存储数据,但是一个是服务器端,另一个是在客户端
ServletContext概念
ServletContext是什么?
ServletContext是Web容器给每个应用程序创建的一个公共空间,每个应用程序都会对应一个ServletContext上下文(公共空间),他的公共范围在对应的应用程序之内。
ServletContext能干什么?
存储数据、提供一些Web容器的功能。
ServletContext与Session的区别:
ServletContext与Session都可以存储数据,但是他们最大的区别则是范围区别,Session的访问范围受限客户端而ServletContext的访问范围受限应用程序。
举个例子:
360浏览器访问项目往ServletContext与Session分别存储了number : 1( 键值对应),在360浏览器中ServletContext、Session通过key值number获取到value值1。
打开火狐浏览器,用ServletContext通过key值number获取到value值1,用Session通过key值number获取到null。