1、Session简介
1)Session是一种Web会话中的常用状态之一。
2)Session提供了一种把信息保存在服务器内存中的方式。他能储存任何数据类型,包含自定义对象。
3)每个客户端的Seesion是独立存储的。
4)在整个会话过程中,只要SessionID的cookie不丢失,都会保存Session信息的。
5)Session不能跨进程访问,只能由该会话的用户访问。应为提取Session数据的id标识是以Cookie的方式保存到访问者浏览器的缓存里的。
6)当会话终止,或过期时,服务器就清除Session对象。
7)Session常用于保存登录用户的ID。
8)Session保存的数据是跨页面全局型的。
9)Session默认有效时间是20分钟。
2、MVC中使用Session
//create
if(Session["name"]==null)
{
Session.Add("name","zhangsan");
}
//read
if(Session["name"]!=null)
{
string name = Session["name"].ToString();
}
//update
Session["name"] = "lisi";
//delete
Session.Abandon();//清除全部Session
Session.Remove("name");
Session.RemoveAll();
3、WebApi中使用Session
1)在MVC的WebApi中默认是没有开启Session会话支持的。需要在Global中重写Init方法来指定会话需要支持的类型
public override void Init()
{
PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
base.Init();
}
void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
2)使用Session
HttpContext context = HttpContext.Current;
//create
if (context.Session["name"] != null)
{
context.Session.Add("name", "zhangsan");
}
//read
if (context.Session["name"] != null)
{
string name = context.Session["name"].ToString();
}
//update
context.Session["name"] = "lisi";
//delete
context.Session.Abandon();//清除全部Session
context.Session.Remove("name");
context.Session.RemoveAll();
4、Session的设置参数
<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" />
1)mode(设置将服务器的Session信息存储到哪里)
Off表示设置为不使用Session功能;
InProc表示将Session存储在进程内,这也是ASP中的存储方式,这是默认值;
StateServer表示将Session存储在独立的状态服务即ASP.NET State Service中;
SQLServer表示将Session存储在SQL Server。
2)cookieless(设置客户端的Session信息存储到哪里)
true表示使用Cookieless模式(这表明SessionId将不再使用Cookie存储了,而是将其通过URL存储);
false表示使用Cookie模式,这是默认值。
从上面的设置配置中我们也可以发现Session和Cookie的关系:
首先Session在客户端的实现肯定是SessionId;
默认这个SessionId是通过Cookie存储的(比较安全);
当然也可以通过URL来进行存储,这样Session和Cookie就没有关系了,但是此种方式由于受URL长度限制以及明文传送导致不安全而不被推荐使用。
3)timeout
Session过期时间设置,默认为20分钟。
4)stateConnectionString
如果设置将Session信息存储在State Server中时,则需要此配置字符串表明服务器名称和端口。
5)sqlConnectionString
如果设置将Session信息存储在SQL Server中,需此配置,表明数据库的连接字符串,同时stateNetworkTimeout表明经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。
5、Session的几种模式
1)InProc
此种模式表示Session将会被保存在内存中,确切地说是保存在工作者进程中,对于IIS 5而言是aspnet_wp.exe,对于IIS 6而言是w3wp.exe,设置方式如下(Web.config)
<sessionState mode="InProc" cookieless="false" timeout="20"/>
由于是直接保存在进程中,所以性能最好,但是经常会发生Session信息丢失,常见的导致进程重启的可能情况为:
配置文件中processModel标签的memoryLimit属性;
Global.asax或者Web.config文件被更改;
Bin文件夹中的Web程序(DLL)被修改;
杀毒软件扫描了一些.config文件;
系统资源紧张进行资源回收导致IIS进程崩溃或重启等。
2)State Server
此种方式是将Session信息存储在其它的进程中而不是IIS中,这样就可以避免因IIS进程崩溃或重启而导致的Session信息丢失。但是此种方式要求保存在Session的信息必须序列化,然后从Session中获取的时候也要反序列化,这就导致性能有略微的损失。
<sessionState mode="StateServer" cookieless="false" timeout="20"/>
StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请把该服务的启动模式设置为自动(这样下次服务就可以随机器而启动)并手工将该服务启动运行。这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的。
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20"/>
此种配置和上面是一样的(多了个stateConnectionString,换句话说127.0.0.1是默认本机IP,42424默认是该服务的访问端口号,写不写效果是一样的),都表示StateServer是在本机(注:StateServer模式是支持远程主机服务的,配置类似与下面)
<sessionState mode="StateServer" stateConnectionString="tcpip=10.7.10.87:42424" cookieless="false" timeout="20"/>
6、Session客户端配置
Session的实现分为两个部分:客户端和服务器端,其中客户端负责产生SessionId,服务器端负责保存具体的内容
1)Session在客户端是如何实现的
Session在客户端是通过产生SessionId来实现的,至于这个SessionId又是通过什么方式回传之服务器从而获得具体的Session内容,前面也略有说明,两种方式:Cookie和Url,由于Url的方式会导致安全性问题,所以现在一般已不再使用此种方式。
当系统是用Session的时候,系统将自动在客户端产生一个Cookie,名称为ASP.NET_SessionId,为了便于区别,我们暂且将此Cookie称为Session Cookie
2)Session Cookie何时失效
和一般的Cookie一样,默认是保存在浏览器的内存中,当浏览器关闭时失效,如果想此Cookie保存在本地磁盘,可通过设置其Expires属性来达到,这种方式现在也被广泛应用于网站的登录,即用户在登录的时候选择记住我或保持登录一段时间,这样当用户下次再次访问的时候就无需再次输入用户名密码从而达到快速访问的目的
HttpCookie httpCookie = new HttpCookie("ASP.NET_SessionId", Request.Cookies["ASP.NET_SessionId"].Value);
httpCookie.Expires = DateTime.Now.AddMinutes(20);
Response.Cookies.Add(httpCookie);
if (!string.IsNullOrEmpty(Request.Cookies["ASP.NET_SessionId"].Value))
{
//...处理相关登录验证等信息
Response.Redirect("Default.aspx?UserName=" + loginUser.UserName + "");
}
3)Session Cookie失效时Session失效吗
Session Cookie和Session的失效没有任何必然的联系,因为它们失效的基准或者条件根本不一样,Session Cookie的失效时间取决于客服端Cookie的失效时间,如果是保存在浏览器中,那么关闭浏览器Session Cookie就将失效,否则如果保存在本地磁盘,则取决于该Session Cookie设置的过期时间;而服务器端的Session是保存在服务器端的,它的失效与否与其服务器端的设置和Session的过期时间有关
4)Session Cookie如何查看
如果设置了Session Cookie的过期时间,则此Session Cookie会保存在本地磁盘,一般是在目录C:\Documents and Settings\user\Local Settings\Temporary Internet Files,此目录可手工设置(Internet选项->常规->浏览历史记录中的"设置"选项->Internet临时文件的"查看文件"选项)。