关于session,需要知道的几点

关于session,之前零零散散的网上找过些资料看,后来却都慢慢淡忘了,感觉是因为没有总结成自己的知识,今天花了半天时间又找文章深入学习了下,现在总结一下,权当复习。

1.session是存储在服务器端的内存中的

我们知道,HTTP协议是无状态的,也就是说同一客户端向web服务器发送多次http请求,服务器并不能辨别是否是来自同一客户,而session很好的解决了状态记录的问题---当用户第一次向服务器端发起请求时(假设用户记录了session),服务器会将session信息记录在内存中,同时生成一个sessionId返回客户端,客户端将此sessionId存储在浏览器中,当再次发起服务器端的请求时,便会携带该sessionId,而服务器就会根据该sessionId来对应到相应的session信息返回给客户。由此我们知道,session是存储在服务器端的内存中的,获取其信息是根据客户端的sessionId(发起http请求时,可以从报文头中查找到该sessionId信息)。也正因为此,session相对于cookie安全很多,因为cookie存储在客户端,容易被篡改,所以重要的数据不建议用cookie存储。

2.session是独立于进程的

就是说,在一个浏览器中访问你的web程序,你的session是在这个浏览器中有效的(如果session没有超时),但如果重新打开一个浏览器,是不会共享之前浏览器中的session的,这时已经是一个全新的会话,可以浏览器工具监视一下就会发现,两个浏览器中sessionId都不一样了。

3.session的时效性

session有效时间可以在web.config中设置,具体如下:

<sessionState timeout="20"></sessionState>

单位为分钟,如上设置,则20分钟后session丢失。如果在程序中想要手动设置session失效(比如注销功能),可以用Session.Abandon()方法。

4.session存储位置的设置

session的存储设置是通过sessionState节点的mode属性完成的,常用的有三种存储方式:InProc(默认),StateServer,SqlServer,下边详细说下:

①InProc 即存储在进程中,这是session默认的存储方式,存储在asp.net工作进程所映射到的内存中,“问题是工作进程为了维护良好的性能,可能会被经常回收”,可以配置应用程序池按固定的时间间隔回收或者超出多大的内存限制后进行回收(见下图),一旦工作进程被回收,其映射到的内存也会被清空,session自然也会丢失。这种存储方式下,重启IIS的话session也会丢失,所以给人感觉并不稳定。当然也有优点:使用简单,效率高

②StateServer

<sessionState  mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"></sessionState>

这种方式是把session存储在asp.net进程之外的aspnet_state.exe进程中的,该进程不受.net进程回收的影响。

aspnet_state.exe是以Windows服务的形式运行的,所以首先保证你的127.0.0.1机器上的asp.net状态服务是启动的:

 

 

③SqlServer

即把session存储在数据库中:

<sessionState mode="SQLServer" sqlConnectionString="data source=.;uid=sa;pwd=******"></sessionState>
方式:进入vs命令模式,敲如下命令:aspnet_regsql.exe -ssadd -sstype p -U sa
具体参数意思,参照这篇文章:http://blog.csdn.net/yuanzhuohang/article/details/6758304  简洁明了
 
该方式能实现session的持久化保存
 
注:②、③两种方式需要session中的数据是可序列化的。相比较①方式,性能有所损耗,但相对更稳定。
 

 

posted on 2015-11-25 21:55  HandyWang  阅读(306)  评论(0编辑  收藏  举报

导航