Session
Session是很简单的,主要是明白了其工作原理就好说了。

当用户第一次访问了服务器上的Session代码后,在服务器内部就会生成一个SessionId和其所对应的Session对象作为Session集合中的一个键值对而已,在相应给客户端的时候就把SessionID以cookie的形式保存到客户端,在浏览器不关闭的时候在访问同域名下的页面,服务器就会读取客户端带来的cookie名为ASP.NET_SessionId的值,然后拿到这个值在去服务器的session池里,找到和该值对应的键,然后将键所对应的值,这个值就是一个Session对象,里面也是键值对的形式,里面包含了我们代码里所设置的值。

下面是执行了Session代码后的服务器端相应给客户端的请求输出

平时所说的,一旦关闭浏览器,则Session就销毁了,其实是不对的,只能说在效果上是销毁了,但是在原理上并没有销毁,根据上面所述,当用户第一次访问了服务器上的Session代码后,在服务器内部就会生成一个SessionId和其所对应的Session对象作为Session集合中的一个键值对而已,在相应给客户端的时候就把SessionID以cookie的形式保存到客户端,但是呢,这个cookie并没有设置过期时间,一旦浏览器关闭,则含有SessionID的cookie也就过期了,等到下次再打开浏览器访问的时候,传到服务器的浏览器里的cookie已经没有了Sessionid,所以服务器的Session池里根本找不到指定的键值对里的键,但是这个键值对还就在那里,我想服务器里最遥远的距离也就是这样了吧,所以造成了Session失效,也就是所谓的一旦关闭浏览器,则Session就销毁了。
既然知道了Session的原理,那么如何能够让Session在关闭浏览器后不失效呢,很简单,直接把服务器返回给客户端的含有Sessionid的cookie持久化到硬盘里不就得了嘛。
像这样,当关闭浏览器后再打开,Session中的值还会出来的。
if (!string.IsNullOrEmpty(Request["name"]))
{
Session["UserName"] = Request["name"].ToString();
HttpCookie hc = new HttpCookie("ASP.NET_SessionId", Session.SessionID);
hc.Path = "/";
hc.Expires = DateTime.Now.AddMinutes(5);
Response.Cookies.Add(hc);
}
小心啊,一定要搞清楚,是要把SessionId存到cookie里,千万不要搞错,我第一次就就把name值传进去了,结果肯定是不出来了,
这是错误的写法:
if (!string.IsNullOrEmpty(Request["name"]))
{
Session["UserName"] = Request["name"].ToString();
HttpCookie hc = new HttpCookie("ASP.NET_SessionId", Request["name"].ToString());
hc.Path = "/";
hc.Expires = DateTime.Now.AddMinutes(5);
Response.Cookies.Add(hc);
}
Session的销毁:
Session是以键值对形式存在的,Session.Abandon()将服务器端的该Session整个对象销毁,Session.Clear()只是将整个Session内的键值对清空,本身还在Session池里。
浙公网安备 33010602011771号