session即HttpContext.Session 属性,命名空间System.Web
我们都知道,Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的。那接下来我们将session的具体使用和原理。
接下来我们一一分析。
1、session概述
session用于存储特定的用户回话所需的信息。Session对象的引入是为了弥补HTTP协议的不足,HTTP协议是一种无状态的协议。
Session中文是“会话”的意思,在ASP.NET中代表了服务器与客户端之间的“会话”。Session的作用时间从用户到达某个特定的Web页开始,到该用户离开Web站点,或在程序中利用代码终止某个Session结束。引用Session 则可以让一个用户访问多个页面之间的切换也会保留该用户的信息。
系统为每个访问者都设立一个独立的Session对象,用以存储Session变量,并且各个访问者的Session对象互不干扰。
Session与Cookie是紧密相关的。 Session的使用要求用户浏览器必须支持Cookie,如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。
Session信息对客户来说,不同的用户用不同的Session信息来记录。当用户启用Session时,ASP.Net自动产生一个SessionID.在新会话开始时,服务器将SessionID当做cookie存储在用户的浏览器中。
2、SessionStateMode分类,配置
默认情况下,系统采用的是InProc模式,即进程内模式。
这种情况下,Session是保存在Asp.Net工作进程映射的内存中的,问题是Asp.Net工作进程为了维护良好的平均性能,会被系统经常回收。
当Asp.Net工作进程被回收时(IIS进程崩溃或者正常重起启),其映射的内存全部被清空并初始化,以便其它程序可以使用,所以Session也跟着一并消失了,就这是为什么Sesssion会无故消失的主要原因。
当然默认的InProc模式也是性能最高的一种模式,如果您不能忍受这种“不稳定”,可以在web.config中把mode设置为StateServer模式,这个模式下不受asp.net进程回收的影响。
session 在web.config中的常用配置信息如下:
<system.web> <sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" timeout="number of minutes" stateConnectionString="tcpip=server:port" sqlConnectionString="sql connection string" stateNetworkTimeout="number of seconds" /> </system.web>
mode:设置将Session信息存储到哪里,该属性有四种可能的值:Off、Inproc、StateServer和SQlServer.
Off:不使用Session功能;
InProc :将Session存储在IIS进程内,这是默认值,也最常用(优点是简单,性能最高。但是当重启IIS服务器时Session丢失。);
StateServer :将Session存储在ASP.NET状态服务进程中(重新启动Web应用程序时保留会话状态,并使会话状态可以用于网络中的多个Web服务器。);
SQLServer :将Session存储在SQL Server中(存储在内存和磁盘中,服务器挂掉重启后都还在)。
timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟。
stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。(默认端口42424)。
sqlConnectionString 设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=joye"。当mode的值是SQLServer时,这个属性是必需的。
stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。
3、session的具体使用方法
//写入
Session["UserName"] = "joye888";
//读取
var userName = Session["UserName"].ToString();
Response.Write(userName);
//遍历
IEnumerator sessionEnum = Session.Keys.GetEnumerator();
while (sessionEnum.MoveNext())
{
Response.Write(Session[sessionEnum.Current.ToString()].ToString() + " ");
}
//销毁
Session.Abandon(); //结束会话
Session.Clear();//不结束会话
MSDN官网实例
string firstName = "Jeff"; string lastName = "Smith"; string city = "Seattle"; // Save to session state in a Web Forms page class. Session["FirstName"] = firstName; Session["LastName"] = lastName; Session["City"] = city; // Read from session state in a Web Forms page class. firstName = (string)(Session["FirstName"]); lastName = (string)(Session["LastName"]); city = (string)(Session["City"]); // Outside of Web Forms page class, use HttpContext.Current. HttpContext context = HttpContext.Current; context.Session["FirstName"] = firstName; firstName = (string)(context.Session["FirstName"]);
4、session运行原理图解
1、cookie存客户端,session存服务端。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
6、Session的利弊
优点:
他能在整个应用中帮助维护用户状态和数据。
他能让我们简单地实现存储任何类型的对象。
独立地保存客户端数据。
对于用户来说,Session是安全的、透明的。
缺点:
因为Session使用的是服务器的内存,所以在用户量大的时候会成为性能瓶颈。
在序列化和反序列化的过程中他也会成为性能瓶颈,因为在StateServer(状态服务)模式和sql server模式下我们需要对我们存储的数据进行序列化和反序列化我们所存储的数据。