Session执行机制与原理
作者:Stanley 罗昊
【转载请注明出处和署名,谢谢!】
什么是Session
首先了解一下Session的中文意思:一次会话,什么是一次会话呢?我举个例子:就我们现在上网,打开浏览器浏览网站当时开始到你关闭浏览器,就称之为一次会话;
也可以这么理解,当你在网上购物,浏览、选择商品、付款、退出,这个就可以理解成一次会话;
一次开始到一次结束;
快速理解Session的执行机制
比如我现在客户端向服务端发送一个请求,这个时候服务端就用会一个Session来跟你一一对应,下面我画一张图来解释:
当张三用游览器向服务器发送一个请求的时候,服务器会给它创建并分配一个Session,同时,李四也访问服务器,这个时候服务器同时也会给李四创建并分配一个Session,两个人一个一个相互独立互不干扰。
分配给你的Session就是用来保存信息的,比如这个时候又来一个王五,王五给服务端发一个请求,这个时候我服务端又产生了一个Session用于保存王五的信息。
Session机制详解
客户端第一次请求服务端时,服务端会产生一个Session对象(用于保存该客户信息);
并且每个Session对象都会有一个唯一的SessionID(用于区分其他Session);
服务端又会产生一个Cookie,并且该Cookie的name 就是写死的 name = JSESSIONID它的value就是刚才Session的ID,valie = 服务端SessionID的值;
然后服务端会在响应客户端的同时,将该Cookie发送给客户端,至此客户端就有了一个Cookie(JSESSIONID),这个JSESSIONID的值就是刚才SessionID的值;
因此,客户端的Cookie就可以和服务器的Session一一对应起来了(【客户端】JSESSIONID =【服务端】 SessionID);
这样就可以保证每个人都拥有一个唯一的Session,来保存用户的信息。
JSESSIONID详解
那么,请求是如何相互对应的呢?这里我举个例子,当张三第一次请求服务端时,它就会产生一个Session对象,Session对象他会自带了一个SessionID,也就是Session产生的同时会带一个SessionID;
这个时候SessionID会把SessionID复制了一份给了JSESSIONID,也就说,SessionID跟JSESSIONID的值是一模一样的,这个时候它就会把JSESSIONID放到Cookie里面;
也就是我第一次请求时,会产生一个Session,并且Session会自带一个SessionID,假设这个SessionID的值是1,这个时候SessionID 1 这个值又赋给了JSESSIONID,这时JSESSIONID的值也是1了,然后我服务端做出响应,上次我也说过,当我们响应的同时会将Cookie给发过去,
Cookie是由服务端产生,所以在响应的时候发给客户端,这时,这个Cookie里面就包含我存的这个值1;
这个时候,我客户端有一个1,我服务端也有一个1,这个时候不就一一对应起来了吗,所以就不会乱,也就说我服务端的SessionID的1与客户端的JSESSIONID的1一一对应用于区分客户;
也就说,我客户端与服务端是通过Session与Cookie对应起来的,Cookie里面的JSESSIONID和Session里面的Sessionid两个相对应。如果还不理解请看我下发画的图:
客户端的JSESSIONID与服务端的SessionID一一对应。
第二次请求
上面我一直在说第一次请求,那如果不是第一次呢?如果是第二次或者更多次呢?
第一次请求的时候给你一个Session对象,那我第二次呢?还需要给吗?当然不需要了;
我第一次已经给你过Session了所以我第二次请求时,就不需要给你Session了,直接找你这个Session就完了;
怎么找?就是根据你的JSESSIONID(客户端)和SessionID(服务端)进行匹配,如果匹配的时候发现客户端JSESSIONID和在服务端存在的SessionID一模一样,就可以说明这个人之前登录成功过或曾经存在过;
因此我们上淘宝上京东我们就会发现,第一次登录成功后第二次就无需登录,一直保持在线状态;
当我们第一次访问京东时我登录了,登录完之后它马上就给我一个Session,里面放用户名密码,因为创建的同时会有一个SessionID,假设这个SessionID的值是4,然后把这个4放到Cookie里面再发给客户端,客户端有个Cookie,我JSESSIONID是4,两者对应起来后我就不需要再进行登录操作了。
Session的重要核心机制
1.Session存储在服务端
2.Session是在同一个用户(客户)请求是共享的【意思就是你第一次开柜子匹配失败发现你是新用户就,给你分配了一把钥匙,当你第二次去开的时候就无需再分配钥匙,今天两个小时之内你不停的去开柜子都不需要再分配钥匙,所以你的请求已经被共享了,只要你有钥匙而且钥匙的上的编号与柜子编号相同,你就可以无限的去开柜子】
3.实现机制:在第一次客户请求时 产生一个Sessionid并赋值给Cookie的JSESSIONID,然后发给客户端,最终通过Session的Sessionid和我们Cookie的JSESSIONID实现一个一一对应关系。
今日感悟:
头等舱可以优先登机,银行VIP可以不用排队,
演唱会最贵的票同时位置也是最好的,
所以,
世界从不平等,
你有多努力,你就有多特殊