Session执行机制与原理
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可以不用排队,
演唱会最贵的票同时位置也是最好的,
所以,
世界从不平等,
你有多努力,你就有多特殊
Session执行机制与原理的更多相关文章
- jsp中session执行机制
- Session会话保持机制的原理与Tomcat Session共享的几种实现方式(Session Cluster、memcached+MSM)
一.Session的定义 在计算机科学中,特别是在网络中,session是两个或更多个通信设备之间或计算机和用户之间的临时和交互式信息交换.session在某个时间点建立,然后在之后的某一时间点拆除. ...
- cookie机制和session机制的原理和区别[转]
一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于在服务器端保持状态的 ...
- 再谈mysql锁机制及原理—锁的诠释
加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...
- flask 源码专题(六):session处理机制
前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...
- logrotate机制与原理[转载]
http://blog.lightxue.com/how-logrotate-works/ 日志实在是太有用了,它记录了程序运行时各种信息.通过日志可以分析用户行为,记录运行轨迹,查找程序问题.可惜磁 ...
- Android(java)学习笔记202:Handler消息机制的原理和实现
联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...
- Java序列化的机制和原理
Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法. 有关Java对象的序列化和反序列化也算是Java基础 ...
- Java序列化机制和原理及自己的理解
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...
随机推荐
- 数据分析 大数据之路 六 matplotlib 绘图工具
散点图 #导入必要的模块 import numpy as np import matplotlib.pyplot as plt #产生测试数据 x = np.arange(1,10) y = x ...
- 小马哥STM32课程系列
小马哥STM32课程系列 http://www.moore8.com/courses/1308
- 极速创建 IOS APP !涛舅舅苹果 IOS APP自助生成系统!不用证书、不用越狱、永久可用
不用签名将网页封装成苹果APP,无需苹果企业签名,IPA签名,ios签名,免越狱安装 (本方法只支持网站封装app,原生的用不了,详细请咨询客服) 近期很多朋友问我把网站变成app的方法,原因很多种, ...
- XP .Net 4.0使用Microsoft.Bcl需要安装XP补丁NDP40-KB2468871-v2-x86
XP .Net 4.0使用Microsoft.Bcl需要安装XP补丁NDP40-KB2468871-v2-x86
- NOIP-接水问题
题目描述 学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1. 现在有n名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从1到n编号,i号同学 ...
- Java_Math/Date
这篇文章我们来研究下java中两个常用的工具类,Math和Date Math: Math是java中各种函数计算集合类,进入到Math类中,可以看到Math是java.lang包下的,被final修饰 ...
- php7安装php-redis扩展
注:操作系统10.13.3 版本,其他版本的Mac系统应该也是可以的 先安装 按照顺序在命令行执行下面命令,如果当前用户权限不够的话,执行命令加上 sudo cd /usr/local/Cellar ...
- python语法_模块_time_datetime_random
模块:可以被公共调用的. time import time print(time.time()) 时间戳方式显示时间. time.sleep(3) 休眠3秒 time.clock() 计算cpu执行时 ...
- Samba部署共享服务
在本地PC文件共享 Samba服务程序是一款基于SMB协议并由服务端和客户端组成的开源文件共享资源软件,实现了Windows和Linux系统间的文件共享 1.安装Samba服务程序 yum in ...
- Mycat对MySQL进行垂直水平分表分库,读写分离
1. MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上.这时集中式数据库系统表现出它的不足: (1)集中 ...