Session会话状态探秘
测试环境:WIN2003 + VS2005 + ASP.NET + C# + IIS6.0
Session 会话状态模式为 InProc的情况下。
官方参考:http://msdn.microsoft.com/zh-cn/library/ms178581(v=vs.80).aspx
Session基本操作
添加 修改 Session项
Session.Add("test", DateTime.Now);
Session["test"] = DateTime.Now;
添加和修改Session的方法是一样的,当指定的Session标识不存在时,系统会添加。当存在时系统会更新。
删除 Session项
Session.Remove("test");
不要使用Session["test"] = null; 这样只是将值设置为NULL!
移除所有Session项
Session.Clear(); 或 Session.RemoveAll();
终止当前会话状态
Session.Abandon();
当前Session项数量
Session.Count
当前SessionId
Session.SessionID
Session何时创建
所有浏览器(IE、Chrome、FireFox)当第一次打开浏览器时(当前未运行浏览器时),服务器端会创建新的Session。
IE浏览器,当已有浏览器运行时,打开新的浏览器则会创建新的Session。
而Chrome、FireFox当已有浏览器运行时,打开新的浏览器不会创建新的Session。
当Session过期后,继续访问时会创建Session。当Session创建时会触发 Global.asax 中的Session_Start方法。
Session何时过期
- 代码 Session.Abandon(); 引起Session过期。
- Session超时,自动过期。
- Web.config 被修改,将会过期。
- IIS的应用程序池被回收引起。
当Session过期时会触发 Global.asax 中的Session_End方法。
奇怪的问题:
Session.Abandon(); 和 Session超时自动过期的效果是一样的。引起的过期后,当刷新页面时会执行Session_Start 和 Session_End方法。
如何避免在Session_Start 中添加Session["SessionStartDateTime"] = DateTime.Now;
在调用Session.Abandon();后执行Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));让SessionId重置。
Session过期时间
在web.config中设置 <sessionState mode="InProc" timeout="20"></sessionState> 分钟值。(未填写时默认是20分钟过期)
IIS的会话超时设置并不起效。(设置位置如下图)
网站关联的应用程序池,的回收时间限制。经测试也不起效。但如果手动回收或设置定时回收则起效。
(如何关联网站应用程序池如下图)
如何防止Session过期
可以设置较长的Session过期时间。但如果设置过长可能会引起服务器负担过重。
将Session模式设置为进程外或数据库中。在此就不做讨论。
一般实际情况可能是,用户在某些页面,如博客文章提交页,在编辑过程因为要很长时间。
可能在提交时发现Session过期了。而导致用户信息丢失无法提交文章。
如果是这种情况,可能只想将指定页面的Session时间延长。可以通过Ajax定时访问后台的一空白页面。来保持Session在线。
<script type="text/javascript">
function updateSession(){
$.get('/ajax/updateSession.aspx');
}
window.setInterval(updateSession, 60000);
</script>
建立一个空页面updateSession.aspx
注意在Page_load中添加 注意当ajax请求aspx页面时,aspx页面应设置为不允许缓存!
protected void Page_Load(object sender, EventArgs e)
{
Response.AppendHeader("pragma", "no-cache");
Response.AppendHeader("Cache-Control", "no-cache, must-revalidate");
Response.AppendHeader("expires", "0");
}
关于SessionId
当Session过期后,SessionId并未改变。
调用 Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); 可设置SessionId
当设置为空时,服务器端会创建新的Session。而老的Session并未被释放。
当设置为其他已有的SessionId值时,此时的Session将获取的是指定的Session。这就是Session劫持了。
如何统计当前网站Session个数。
创建类
public class Constants { /// <summary> /// 当前Session个数 /// </summary> public static int SessionCount = 0; /// <summary> /// 累计Session个数 /// </summary> public static int SessionAllCount = 0; }
在Global.asax中添加
void Session_Start(object sender, EventArgs e) { Constants.SessionAllCount++; Constants.SessionCount++; Session["SessionStartDateTime"] = DateTime.Now; } void Session_End(object sender, EventArgs e) { Constants.SessionCount--; }
测试代码下载
测试代码下载: https://files.cnblogs.com/zjfree/SessionTest.rar
测试环境:WIN2003 + VS2005 + ASP.NET + C# + IIS6.0