EF架构~二级域名中共享Session

简介:

对于一个有点规模的网站,都会有各个子网站,说是子网站,其实也都是独立的站点,一般通过二次域名来分开,如www.zzl.com,它可以有很多子网站,如image.zzl.com,file.zzl.com,sale.zzl.com,manage.zzl.com,news.zzl.com等等!

而如果希望在各个项目中共享你的登陆状态,我们通过的做法是通过cookies实现,但使用cookies就有安全性的问题,因为它的信息保存在客户端,这是重所周知的,而session本身不支持跨域,即使是二级域名,也是不可以的.(cookies可以在各二级域名中共享信息),当然,这只是对于inpro的存储方式来说的,如果你是sqlserver或者StateServer的方法,那么,通过一些设置,还是可以实现session的跨域的,下面来说一下实现方式.

一 建立一个httpModule,在页面加载完成后,执行这个方法,将域名的asp.net_sessionId重写

    /// <summary>
    /// session共享sessionId
    /// </summary>
    public class SessionProviderHttpModule : IHttpModule
    {
        private string m_RootDomain = string.Empty;

        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            m_RootDomain = ".mvvm.com";

            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++)
            {
                if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
                {
                    app.Context.Response.Cookies[i].Domain = m_RootDomain;
                }
            }
        }
    }

二 将这个httpModule注入到项目中

web.config方法

 <sessionState cookieless="false"
                 timeout="50"
                 mode="StateServer"
                 stateConnectionString="tcpip=localhost:42424"/>
    <httpModules>
      <add name="CrossDomainCookieModule"
           type="EntityFrameworks.Application.Core.HttpModule.SessionProviderHttpModule,EntityFrameworks.Application.Core"/>
    </httpModules>

预处理程序方法

    /// <summary>
    /// 预处理代码
    /// </summary>
    public class PreApplicationStartCode
    {
        public static void Start()
        {
            // Register our module
            Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(EntityFrameworks.Application.Core.HttpModule.SessionProviderHttpModule));
        }
    }

三 设置注册表相关项,启动asp.net的session服务,如图

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters

AllowRemoteConnection值为1,Port值可以任意设置,默认为42424

四 当我们设置好上面内容后,我们的session共享就完成了,测试后的结果,如图

通过图上我们可以看到,它们的ASP.NET_SessionId是相同的,我们知道,浏览器在没有进行用户session写入时,每次刷新,这个值都会变,但当用户使用session序列化后,这个值就固定了,当你把浏览器关闭后,这个值也同时消失,可以说,它是服务器端session的唯一标示,这个值如果相同,服务器就会认为,你的网站是在同一个域下的,它们的信息是共享的,反之,它们就是自立独立的,就像两个应用程序域一样,它们之间是不能相互通讯的.

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~二级域名中共享Session,如需转载请自行联系原博主。

目录
相关文章
|
安全 Go API
第二十四章 CSP Session 管理 - 认证架构
第二十四章 CSP Session 管理 - 认证架构
|
NoSQL Redis
分布式Session架构演示史(下)
分布式Session架构演示史
96 0
分布式Session架构演示史(下)
|
缓存 前端开发 NoSQL
分布式Session架构演示史(上)
分布式Session架构演示史
102 0
分布式Session架构演示史(上)
|
存储 NoSQL 应用服务中间件
bboss session共享架构及特点
bboss会话共享架构 bboss session共享特点 作    用:为应用提供统一会话管理功能,避免集群部署场景下负载切换session丢失问题; 跨域跨应用共享会话并实现SSO功能;解决了会话共享五大技术难题:session数据序列 化问题,session sticking问题,跨域跨应用session共享问题,跨容器 (tomcat,jetty,weblogic)共享session问题,sso单点登入单点登出一致性问题。
1292 0
企业互联网应用架构的探索:共享服务
互联网时代背景下,共享服务成为一种必要的方式。在本文中,云徙科技首席架构师陈新宇就从共享服务的背景、优势以及如何建设和运营共享服务,这几个方面进行了精彩的分享。
2985 0
|
Web App开发 存储
架构文摘:分布式系统Session一致性问题解析
一、问题的提出 1. 什么是Session? 用户使用网站的服务,需要使用浏览器与Web服务器进行多次交互。HTTP协议本身是无状态的,需要基于HTTP协议支持会话状态(Session State)的机制。
1697 0
|
前端开发 Java 应用服务中间件