ASP.NET二级域名站点共享Session状态
来源:互联网 发布:淘宝p授权书查得出来吗 编辑:程序博客网 时间:2024/04/30 10:32
我的前面一篇文章提到了如何在使用了ASP.NET form authentication的二级站点之间共享登陆状态,
http://www.cnblogs.com/jzywh/archive/2007/09/23/902905.html,
今天, 我要写的是如何在二级域名站点之间,主站点和二级域名站点之间共享Session。
首先, Session要共享,站点之间SessionID必须要一致,那怎么保证SessionID一致呢?
ASP.NET中的SessionID是存储在客户端的cookie之中键值为ASP.NET_SessionId用来维护浏览者Session对应关系的一个字符串,要想在二级域名站点之间,主站点和二级域名站点共享SessionID就必须先共享,那么我们就必须先实现ASP.NET_SessionId这一cookie的共享。
A: CrossDomainCookieModule
------------------------------------------------------------------------------------------------
public class CrossDomainCookie : IHttpModule { private string m_RootDomain = string.Empty; #region IHttpModule Members public void Dispose() { } public void Init(HttpApplication context) { m_RootDomain = ConfigurationManager.AppSettings["RootDomain"]; context.EndRequest += new System.EventHandler(context_EndRequest); } void context_EndRequest(object sender, System.EventArgs e) { HttpApplication app = sender as HttpApplication; for (int i = 0; i < app.Context.Response.Cookies.Count; i++) { app.Context.Response.Cookies[i].Domain = m_RootDomain; } } #endregion }
上面的Module重设了所有cookie的domain到root domain, root domain在web.config中设置。也许有人会说这是眉毛胡子一把抓重写了所有cookie的domain, 那他也可以判断一下cookie的name, 如果为ASP.NET_SessionId的话才重写。
如果主站点和二级域名站点是同一站点,那么做到这一步,你的session就已经共享了,因为Session的ID是相同的,而且Session容器也是同一个。
如果主站点和二级域名站点是两个不同站点,则需要进行更多的操作了。
如果两个站点是不同的服务器的话,解决方法要简单点:
1) 使用相同的state server来存储Session.
2) 在两个站点的web.config设置相同的machineKey.
MachineKey的设置请参考http://msdn.microsoft.com/zh-cn/asp.net/w8h3skw9.aspx
3) 给两个站点设置相同name
这样做是为了确保两个站点的siteID相同,siteID是site name的hash值,注意请不要使用默认站点,因为默认站点的siteID并非site name的hash.
如果两个站点是在同一的服务器的话,需要对CrossDomainCookie再作一下修改,此方法也可应用于两个站点在不同服务器的情况:
1) 使用相同的state server来存储Session.
2) 用反射来设置System.Web.SessionState.OutOfProcSessionStateStore的静态字段s_uribase的值
public class CrossDomainCookie : IHttpModule { private string m_RootDomain = string.Empty; #region IHttpModule Members public void Dispose() { } public void Init(HttpApplication context) { m_RootDomain = ConfigurationManager.AppSettings["RootDomain"]; Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore"); FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic); if (uriField == null) throw new ArgumentException("UriField was not found"); uriField.SetValue(null, m_RootDomain); context.EndRequest += new System.EventHandler(context_EndRequest); } void context_EndRequest(object sender, System.EventArgs e) { HttpApplication app = sender as HttpApplication; for (int i = 0; i < app.Context.Response.Cookies.Count; i++) { app.Context.Response.Cookies[i].Domain = m_RootDomain; } } #endregion }
完成这样的修改之后就可以实现Session的共享了。
同样如果你是使用SQL server来存储Session, 也可以使用类似的方法来解决Session共享问题。
- ASP.NET二级域名站点共享Session状态
- ASP.NET二级域名站点共享Session状态
- [ASP.NET]Session在多个站点之间共享解决方案
- thinkphp 二级域名站点 session共享(单点登录)
- Asp.Net使用Memcached存储Session并实现二级域名共享(mysql数据库)
- ASP.NET 2.0 二级域名Forms验证模式下共享登陆状态
- asp.net Session 共享
- Asp.net session共享
- ASP.NET中在不同的子域中共享Session(二级域名获取不到主域名下的session值)
- 多个ASP.NET站点如何通过ASP.NET State服务共享Session会话
- jsp 二级域名共享session
- 二级域名session 共享方案
- Tomcat二级域名共享SESSION
- tomcat 二级域名 session共享
- 多个.Net站点共享一个Session
- Asp.net中处理一个站点不同Web应用共享Session的问题
- Asp.net中处理一个站点不同Web应用共享Session的问题
- 跨站点共享Session解决方案、单点登录解决方案(ASP.NET 2.0版本)
- 如何高效地判断奇数和偶数
- 各种常用数据库使用JDBC连接的方式
- C#.NET平台的AutoCAD二次开发
- J2EE - 业务过程
- 汉字编码(2 编码转换实现实例)
- ASP.NET二级域名站点共享Session状态
- 【转】2007年最受欢迎的资源top100
- 百度内部邮件
- 内核定时器的使用
- 汉字编码-1基础知识
- [VB]获取本机的IP地址
- 如何构造一个C#语言的爬虫程序
- ASP.NET中页面刷新用户选择丢失的问题
- struts1和struts2的区别