ASP.NET中在不同的子域中共享中在不同的子域中共享Session的具体方法的具体方法
今天遇到了这个问题,于是研究了一下。要解决这个问题,首先就要明白一些Session的机理。Session在服务器是以散列表
形式存在的,我们都知道Session是会话级的,每个用户访问都会生成一个Session。那么服务器是怎么区分不同用户的
Session?又是怎么将不同用户的Session与不同的用户绑定的呢?下面我们来研究一下,以下纯属我个人的理解,如有错误
请指证。
Session在服务器端是以散列表的形式存在的,区分每一个Session是通过SessionID来实现的,所以可以说这个SessionID是
一个Key是一个全局唯一的值。我们可以通过ASP.NET来打印出SessionID,如下代码:
代码如下:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Session.SessionID.ToString());
}
这样我们就得到了这样的值:0julmoedn0kz3gyfnr1vksv0,有点像是GUID,就算不是算法也都是类似的,主要就是为了保证全
局唯一性。这样就达到了区分不同用户的Session的目的。接下来还有第二个问题,那就是SessionID有了,但是它又是怎么
和相应的访问者(用户)绑定的呢?比如说用户A访问维护了自己的SessionID,用户B访问也维护了自己的SessionID。我们都
知道web是基于http无链接的,他们又是怎么做到的呢?没错,答案就是在客户端存储了自己的SessionID。浏览器存储
SessionID有两种方式,一种就是利用Cookies;还有一种就是利用url参数(这种我们不常用,很不友好)。
话题说到Cookies上来了,怎么的?没想到Session和Cookies还有这样的关系吧?(很多人知道,别BS我)没错,当我们请求一
个URL时候,服务器会生成一个全局的SessionID,并且把这个值以Cookies的形式保存在客户端也就是浏览器(这里暂不讨
论url方式)。这样当用户再去请求的时候,在http头把这个SessionID的Cookie发到服务器端,服务器就去找这个
SessionID,如果找到了。就证明这个用户的状态是存在的。
知道了这个原理,我们的问题也就有眉头了,即然是用Cookies来保存SessionID,那么我们就可以在Cooikes上做手脚了。我
们都知道Cooikes记录方式是以域(例如://www.jb51.net/)为区分的,这也是各种浏览器规定的。如果不这么做,安全性就会
有问题。我们要做的就是让指定Cookies的父域方式,不指定具体指域,这样Cookies就可以跨子域了。Cookies可以像这样指
定域:
代码如下:
protected void Page_Load(object sender, EventArgs e)
{
Response.Cookies[“MyCook”].Domain = “.jb51.net”;
}
这样,我们所有的二级域全部是认这一个主域的,比如a.jb51.net;b.jb51.net;user.jb51.net等等。有了这个认识,我想大家心
里也有数了,该怎么怎么做,但是现在问题是用来生成SessionID的方法是ASP.NET自动实现的,我们又怎么去干涉它呢?这
是这样做的,不主动干涉它,但是我可以操作它的Cookies啊。接下来我们就研究ASP.NET存SessionID的Cooike的名字是什
么。经过网上很容易就查找到了,名字是:ASP.NET_SessionId,这个就是SessionId的Cookies名字。我们可以在
Session_Start中这样写:
代码如下:
protected void Session_Start(object sender, EventArgs e)
{
Response.Cookies[“ASP.NET_SessionId”].Value = Session.SessionID.ToString();
评论0
最新资源