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记录方式是以域(例如:http://www.local.com/)为区分的,这也是各种浏览器规定的。如果不这么做,安全性就会有问题。我们要做的就是让指定Cookies的父域方式,不指定具体指域,这样Cookies就可以跨子域了。Cookies可以像这样指定域:

protected void Page_Load(object sender, EventArgs e)

{

     Response.Cookies["MyCook"].Domain = ".local.com";

}

  这样,我们所有的二级域全部是认这一个主域的,比如a.local.com;b.local.com;user.local.com等等。有了这个认识,我想大家心里也有数了,该怎么怎么做,但是现在问题是用来生成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();

Response.Cookies["ASP.NET_SessionId"].Domain = ".local.com";

}

  代码的意思是每次会话开始的时候,我都把ASP.NET_SessionId这个Cookie重写成我们已有的SessionID,并且把这个Cookie的domain指定为父域,比如:.local.com,这样就可以实现跨子域的Session共享了。怎么样很简单吧?

  我们还有一个外题问题,就是客户端保存的问题解决了,但是服务器端的Session怎么办?一般情况下我们不同的子域做的是指向不同的服务器的,比如user.local.com 专门一台服务器,yellow.local.com专门一台服务器。这时它们别说是进程了,连物理上都不是一个了。Session怎么共享?这时就用到另一个方法了,我们默认的Session是存储在asp.net进程中的,这样没法互相访问,如下面所示:

<sessionState mode="InProc" />

  我们可以修改为State Server方式,这是一个单独的服务可以用来存储ASP.NET Session的,它支持分布式远程主机的,这样我们可以用一台服务器来提供Session服务,如下所示:

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="30" />

  这样,就完全实现了不同子域的Session共享了。

  前面说到Url保存SessionId的方式,由于不常用,给大家演示一下,如下配置就可以了:

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="30" cookieless="true" />

  cookieless属性指定是否用cookie来保存SessionId,我们运行一下得到下面的样子:

  http://localhost:3380/(S(dqxcs455n4u2vg55ia51fvqg))/default.aspx

时间: 2024-10-22 04:44:41

ASP.NET中在不同的子域中共享Session的相关文章

ASP.NET实现在不同的子域中Session共享

今天遇到了这个问题,于是研究了一下.要解决这个问题,首先就要明白一些Session的机理.Session在服务器是以散列表形式存在的,我们都知道Session是会话级的,每个用户访问都会生成一个Session.那么服务器是怎么区分不同用户的Session?又是怎么将不同用户的Session与不同的用户绑定的呢?下面我们来研究一下,以下纯属我个人的理解,如有错误请指证. Session在服务器端是以散列表的形式存在的,区分每一个Session是通过SessionID来实现的,所以可以说这个Sess

asp.net子应用程序/虚拟目录如何共享session

我做的asp.net mvc应用程序要作为一个子应用程序部署到几个站点中,需要在本应用程序中获取站点的session值. 已经使用了session state server,并设置了machine key,但还是不行. 这个问题折腾了整整一天的时间,下面是解决办法. 建立一个HttpModule /// <summary>/// 这个模块需要放到整个管道的前端/// </summary>public class SessionShareModule : IHttpModule{  

ASP.NET中在不同的子域中共享Session的具体方法_实用技巧

今天遇到了这个问题,于是研究了一下.要解决这个问题,首先就要明白一些Session的机理.Session在服务器是以散列表形式存在的,我们都知道Session是会话级的,每个用户访问都会生成一个Session.那么服务器是怎么区分不同用户的Session?又是怎么将不同用户的Session与不同的用户绑定的呢?下面我们来研究一下,以下纯属我个人的理解,如有错误请指证. Session在服务器端是以散列表的形式存在的,区分每一个Session是通过SessionID来实现的,所以可以说这个Sess

php中http与https跨域共享session的解决方法_php技巧

遇到了HTTP.HTTPS协议下session共享解决cookie失效的问题,这里提供一个临时解决办法. 实现原理:把session id设置到本地的cookie. 如下: 复制代码 代码如下: $currentSessionID = session_id(); session_id($currentSessionID ); 以下是实现代码,分为http与https两部分. 1,http部分: 复制代码 代码如下: <?php session_start();  $currentSessionI

.net 子域名共享session,sessionid一致,mode使用stateserver仍然失败

问题描述 1.sessionState的mode使用了stateserver,tcpip=127.0.0.1:424242.machineKey一致,不同子域名的sessionid也一致环境:vm10.0.1,win2003,IIS,绑定了a.xx.com,b.xx.com,c.xx.com,每个域名的主目录不一样,但是内容是同步的问题:a.xx.com登陆后,其他网站仍然要登陆,也就是其他域名取不到session内容,但是抓包发现asp.net_sessionid的值是一样的求指点,谢谢 解决

asp.net-ASP.NET web项目中GridView选中行样式中如何切换选择按钮的图标?

问题描述 ASP.NET web项目中GridView选中行样式中如何切换选择按钮的图标? 我用的ASP.NET 4.0开发的网站项目,GridView控件中选中行的样式,启用控件自带的选择按钮, 想实现选中一行,该行的选择图标按钮会自动改变图标,如何才能实现动态更换CommandField的SelectImageUrl? 在SelectedRowStyle中指定cssclass可以实现吗?这种前台的样式脚本中,能获取GridView的CommnadField控件对象吗? 如有成功的同行能够解答

以前收集的一些资料---如何在ASP中通过ODBC调用Excel中的数据

excel|odbc|数据                如何在ASP中通过ODBC调用Excel中的数据    在ASP中通过ODBC调用Excel中的数据方式和普通的通过ODBC调用数据库的方式有一些不同的地方.下面将介绍如何通过ODBC在ASP中使用Excel的数据.    在使用的过程中,要注意的是你需要使用的ODBC驱动为:Microsoft ODBC Driver for Excel. 下面给出一个例子来具体说明如何调用的过程:1.在Excel的电子表格中新建一个叫Range的表单a

ASP.NET Web API Selfhost宿主环境中管道、路由

前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这个框架由于宿主环境的不同在不同的宿主环境中管道中的实现机制和路由的处理方式有着很大的不同,所以我会将对应不同的宿主环境来分别的做出简单的讲解.  ASP.NET Web API路由.管道     ASP.NET Web API 开篇介绍示例     ASP.NET Web API 路由对象介绍     ASP.NET Web API 管道模型     ASP.NET

ASP和数据库技术在WAP开发中的应用

数据|数据库 利用ASP技术可以开发出动态WAP页面,将ASP技术和数据库技术相结合,则可以开发更为复杂的WAP应用.有关ASP和Web数据库的知识请读者参考专门书籍,我们这里以WML为例,说明ASP和数据库技术在WAP开发中的应用. 在WML程序中使用ASP 在WML程序中使用ASP的规则很简单,只要做到以下5条即可: (1) 声明ASP采用的脚本语言.与ASP中声明的方式类似,格式为: <%@ Language=VBScript %> (2) 声明wml文件类型.这可采用ASP的Respo