会话状态Session解析以及原理分析
我们知道web网站在客户端存储数据有三种形式:1. Cookie 2. hidden(隐藏域) 3.QueryString 其中viewstate什么的都是通过第二种方式隐藏域存储滴。
客户端存储数据有三种形式,那服务器端有几种呢? 嘿嘿 服务器端有:1. Session 2. Application 3. database 4. caching(缓存) 其中session用的较多,当然数据库是必须的。
开发过管理系统项目(不限大小)的童鞋应该都接触过session,在管理系统中session最典型的应用就是当用户登录后在服务器端记录客户的唯一标示(比如用户名),然后再另外的页面中使用这个信息,当然也能判断用户是否登录后进入的系统,防止没有授权直接进入系统。
先看一下怎么使用session吧
//添加一个名为sessionTest的Session并且给他赋值
Session["sessionTest"] = "test";
//读取Session名为sessionTest的值
Response.Write(Session["sessionTest"].ToString());
1. 很简单吧!除了人为的创建session,还有就是当客户端浏览器访问一个站点的时候,服务端会自动创建一个session来存储客户端的信息,那么问题来了服务端不可能就一个客户端访问吧!会有成千上万的客户端访问它,那么问题又来了,服务端怎么区分不同的客户端呢?
1.1 说到这就要引入一个新的名词了什么呢 ? 没错 sessionID,那么什么是sessionID呢?
简单的说当客户端第一次访问某个站点的时候,将会在服务端生成一个唯一的Key,然后发送给客户端,在服务器端通过Key来取得相应的数据。通常,我们将这个key称为SessionID。
1.2 大家都知道HTTP是无状态的,那么这个sessionID保存到客户端的什么地方呢?想想客户端“我们知道web网站在客户端存储数据有三种形式:1. Cookie 2. hidden(隐藏域) 3.QueryString” ,这三个你觉得那个更有可能,没错是cookice,当然当客户端禁用cookice的情况先就会采用存储在QueryString中。
2. 服务端的session
2.1 在页面对象或者HttpContext对象中,都有一个名为Session的属性,在一次会话中,它们引用的都是同一个对象,定义如下
public virtual HttpSessionState Session { get; }
在往上来看看HttpSessionState怎么定义的
public sealed class HttpSessionState : ICollection, IEnumerable
2.1.1 从这个类中我们可以找到操作session 的一些方法,下面是一些常用的方法
1 public void Abandon();
2 public void Add(string name, object value);
3 public void Clear();
4 public void Remove(string name);
5
6 public object this[int index] { get; set; }
7 public object this[string name] { get; set; }
从字面意思上就大概知道是什么方法,所以我就不一一解释了,看到6,7行可以知道session可以通过索引的方式访问。
2.1.2 这个HttpSessionState来自于SessionStateModule。在每次请求处理过程中,HttpApplication在请求的处理管道中会检查当前请求的处理程序是否实现了接口IRequiresSessionState,如果实现了,那么SessionStateModule将为这个请求分配HttpSession。同时SessionModule还负责SessionID的生成 CookIeless会话管理。顺便提一下在使用一般处理程序的时候,默认情况下并没有实现这个接口,所以,如果在一般处理程序中使用Session必须实现IRequiresSessionState接口否则会导致异常。
3. 客户端的SessionID
第一次访问某站点的报文

从相应报文中可以明显的看到服务端为客户端添加了一个Cookice,所以这个Cookice的值就为SessionID,还可以看到服务端并没有指定这个Cookice的过期时间所以这个Cookice会存储在内存中当浏览器关闭后,Cookice会立即消失。
第二次访问

从请求报文中很明显的看到,客户端想服务端发送了一个名为ASP.NET_SessionId的Cookice
会话状态Session解析以及原理分析的更多相关文章
- ASP.NET Session的实现原理分析
ASP.NET Session的实现原理分析 用户向服务器提交请求时,服务器都会给每个用户分配一个SessionId,保存在用户浏览器的Cookies中,SessionId是全局的,也就是说只要Coo ...
- Spring-Session实现Session共享实现原理以及源码解析
知其然,还要知其所以然 ! 本篇介绍Spring-Session的整个实现的原理.以及对核心的源码进行简单的介绍! 实现原理介绍 实现原理这里简单说明描述: 就是当Web服务器接收到http请求后,当 ...
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe
消息队列NetMQ 原理分析4-Socket.Session.Option和Pipe 前言 介绍 目的 Socket 接口实现 内部结构 Session Option Pipe YPipe Msg Y ...
- java基础解析系列(七)---ThreadLocal原理分析
java基础解析系列(七)---ThreadLocal原理分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ...
- dubbo源码解析五 --- 集群容错架构设计与原理分析
欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...
- Spring的xml解析原理分析【转载】
一:前言 二:spring的配置文件 三:依赖的第三方库.使用技术.代码布局 四:Document实现 五:获取Element的实现 六:解析Element元素 七:Bean创造器 八:Ioc容器的创 ...
- 消息队列NetMQ 原理分析3-命令产生/处理和回收线程
消息队列NetMQ 原理分析3-命令产生/处理和回收线程 前言 介绍 目的 命令 命令结构 命令产生 命令处理 创建Socket(SocketBase) 创建连接 创建绑定 回收线程 释放Socket ...
- 消息队列NetMQ 原理分析5-StreamEngine、Encord和Decord
消息队列NetMQ 原理分析5-StreamEngine,Encord和Decord 前言 介绍 目的 StreamEngine 发送数据 接收数据 流程分析 Encoder V2Encoder V1 ...
- SpringMvc框架MockMvc单元测试注解及其原理分析
来源:https://www.yoodb.com/ 首先简单介绍一下Spring,它是一个轻量级开源框架,简单的来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开 ...
随机推荐
- bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...
- Pritunl:简易搭建个人VPN及年费200的超编译独立主机 BandwagonHost
https://pao-pao.net/article/213 Pritunl:简易搭建个人VPN 文/ Vergil 一 直以来安装 VPN 服务.提供全局加密代理,是租用VPS(虚拟主机)的一个重 ...
- ASP.NET中的注释 .
之前只知道<!-- -->可以注释掉html页面中的某些部分,或者添加注释说明.今天又看到<%----%>也能添加注释,于是我不解了,google一下. <!--注释-- ...
- 基于redis的IP地址快速查询
在一些大数据处理中,我们需要用到IP地址查询,一般为了查询一个IP属于哪个地址,我们通常需要根据一个IP数据库来查询,网络上比较常用的IP库是纯真IP数据库.IP数据库里面的记录一般存储方式为IP的开 ...
- support-v4不能查看源码
在Android实际开发过程中往往会遇到使用v4,v7或v13兼容包中的一些类如ViewPager,Fargment等,但却无法关联源码 具体步骤: 1 右击Android项目中libs文件夹下的an ...
- Using breakpad in cocos2d-x 3.2,dump信息收集
作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037268.html 一.基本步骤 1.生成转换工具 2.把breakpad加入到项目 ...
- Android Studio Error2
ECLIPSE ANDROID PROJECT IMPORT SUMMARY ====================================== Ignored Files: ------- ...
- JavaScript toFixed() 方法
定义和用法toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 语法NumberObject.toFixed(num) 参数 描述num 必需.规定小数的位数,是 0 ~ 20 ...
- delphi 连接mysql
Delphi连接MySQL真麻烦,研究了一天,从网上找了无数文章,下载了无数插件都没解决.最后返璞归真,老老实实用ADO来连接,发现也不是很顺利,但最终还是连接成功了.多少有点心得:ADO各个组件的作 ...
- Android设计模式(1)----单例模式
在非常多设计模式中.我相信大多数程序员最早接触的设计模式就是单例模式啦,当然了我也不例外. 单例模式应用起来应该是全部设计模式中最简单的.单例模式尽管简单,可是假设你去深深探究单例模式,会涉及到非常多 ...