现在的位置: 首页 > 综合 > 正文

Session探秘

2012年03月09日 ⁄ 综合 ⁄ 共 2647字 ⁄ 字号 评论关闭
文章目录

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--;
}

测试代码下载

测试代码下载: http://files.cnblogs.com/zjfree/SessionTest.rar

测试环境:WIN2003 + VS2005 + ASP.NET + C# + IIS6.0

抱歉!评论已关闭.