• 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_MACHINESYSTEMCurrentControlSetservicesaspnet_stateParameters

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

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

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

     回到目录

  • 相关阅读:
    iOS 网易新闻用到的框架
    iOS homekit使用说明
    iOS 如何在整个屏幕中都能实现滑动返回的效果
    iOS 如何设置导航的滑动返回手势, 和系统饿一样
    iOS 7 tabbar 透明的问题
    iOS 使用xib后获取view的frame出错的问题
    Masonry 当需要把某个控件进行隐藏的时候有警告的解决方案
    java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)
    java 中多线程之间的通讯之等待唤醒机制
    linux时间同步chrony介绍
  • 原文地址:https://www.cnblogs.com/lori/p/3723714.html
Copyright © 2020-2023  润新知