ASP(Active Server Pages)技术的Session对象用于存储用户在对话期间的私有信息。当前用户的Session对象中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问,因此在用ASP开发网络应用程序时,可以利用Session对象保存和跟踪用户的状态信息。
Session对象有一个十分重要的属性:Timeout,它用于设置在会话资源被释放前,会话对象所能保持非活动状态的时间(默认值为20分钟)。当Timeout属性设置的时间值耗尽后,会话资源将被释放。通过Timeout属性破坏Session对象,避免了Session对象在服务器中无限制地产生,保护了服务器资源。
同理,ASP.NET中的Session继承了以上功能。那么这里简单谈谈Session的Timeout的一些设置(即Session的有效期)。
最简单的设置方式延长Session有效期。
1、设置网站的应用程序配置
2、设置ASP.NET中的配置,修改webconfig文件。(也可以通过代码添加)
3、Session储存的位置绝对不在客户端。Session储存方式有三种,可在web.config中设置。
InProc模式,这种模式下Session保存在ASP.NET的进程内,是一个内部容器,在同一个应用程序目录是共享的,但是如果这个进程被Web服务器回收,则Session就会丢失,所以这种模式很不稳定。
StateServer模式,这种模式下Session被保存在一个Windows Service的进程内,Windows Service的进程比ASP.NET的进程稳定得多,只要开启这个服务的电脑不当机,一般来说都是比较稳定的。
SQL Server模式,这种模式就更进一步,将Session保存到了数据库中,通过牺牲效率换取稳定。
也可通过ASP.NET配置设置
4、存储的类型和大小?
一般来说,InProc模式下,Session对储存的对象没有任何限制。而在StateServer和SQL Server模式中,由于Session需要跨进程保持,所以要求所储存对象的类型必须是可序列化的。虽然Session对所储存的数据大小没有什么限制,但不建议在Session中储存太多的东西。
5、生命周期是怎么样的?
正常情况下Session在新的客户端第一次访问页面时创建,在超过超时时间没有任何页面访问后销毁。
6、常见的访问方法
一般来说Session这种公用容器需要为期专门撰写访问类,而不应直接访问。
一个简单的访问类可能看起来是这样的:
public MyContext
{
public static MyContext Current
{
get { return HttpContext.Current.Session["hnop"] as MyContext; }
set { HttpContext.Current.Session["hnop"] = value; }
}
}
7、比较
Session的特点很突出,就是他与客户端有关,一般来说只要客户端不关闭浏览器,那么他访问的所有的页面所获得的都是同一个Session容器。我们可以往Session中放入用户相关的信息,如登陆信息。但要注意的是,Session是一个公共容器,所以他里面的信息可以被任何运行在服务器上的代码所修改。