zoukankan      html  css  js  c++  java
  • .NET二级域名共享Session

    ASP.NET二级域名站点共享Session状态
      今天, 我要写的是如何在二级域名站点之间,主站点和二级域名站点之间共享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
      validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4"
      decryptionKey="5FC88DFC24EA123C"
      validation="SHA1"/>
      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共享问题。
    
    来源:Diy综合信息网.NET二级域名共享Session
  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/xyzhuzhou/p/3637952.html
Copyright © 2011-2022 走看看