中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

EF架構~二級域名中共享(xiang)Session

回到目錄

對于一(yi)(yi)個(ge)有點規模的(de)網站(zhan),都會有各個(ge)子(zi)(zi)網站(zhan),說是子(zi)(zi)網站(zhan),其實也(ye)都是獨立(li)的(de)站(zhan)點,一(yi)(yi)般(ban)通過二次域名來分開,如www.zzl.com,它可以有很多子(zi)(zi)網站(zhan),如image.zzl.com,file.zzl.com,sale.zzl.com,manage.zzl.com,news.zzl.com等等!

而(er)如果希望在各個項目中(zhong)共(gong)享你的(de)(de)登陸狀態,我(wo)們通過(guo)的(de)(de)做法是(shi)(shi)(shi)通過(guo)cookies實現,但使用cookies就(jiu)有安全性的(de)(de)問題,因(yin)為它(ta)的(de)(de)信息保存(cun)在客戶端(duan),這(zhe)是(shi)(shi)(shi)重所周知的(de)(de),而(er)session本(ben)身不(bu)支持跨域,即使是(shi)(shi)(shi)二級域名,也是(shi)(shi)(shi)不(bu)可以的(de)(de).(cookies可以在各二級域名中(zhong)共(gong)享信息),當然,這(zhe)只是(shi)(shi)(shi)對于(yu)inpro的(de)(de)存(cun)儲方式來(lai)說的(de)(de),如果你是(shi)(shi)(shi)sqlserver或者StateServer的(de)(de)方法,那么(me),通過(guo)一些設置,還是(shi)(shi)(shi)可以實現session的(de)(de)跨域的(de)(de),下面(mian)來(lai)說一下實現方式.

一(yi) 建立一(yi)個httpModule,在頁面加載完成后,執行(xing)這個方法,將域名(ming)的(de)asp.net_sessionId重(zhong)寫

    /// <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;
                }
            }
        }
    }

二 將這(zhe)個httpModule注入(ru)到項目(mu)中

web.config方(fang)法

 <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));
        }
    }

三 設置注(zhu)冊(ce)表相關項,啟動asp.net的(de)session服務,如(ru)圖

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters

AllowRemoteConnection值為(wei)1,Port值可(ke)以(yi)任意設置,默(mo)認為(wei)42424

四 當我們設置好上面(mian)內容后(hou),我們的session共(gong)享就(jiu)完成了(le),測試(shi)后(hou)的結果,如圖

通過圖上我們可以看到,它們的ASP.NET_SessionId是相同的,我們知道,瀏覽器在沒有進行用戶session寫入時,每次刷新,這個值都會變,但當用戶使用session序列化后,這個值就固定了,當你把瀏覽器關閉后,這個值也同時消失,可以說,它是服務器端session的唯一標示,這個值如果相同,服務器就會認為,你的網站是在同一個域下的,它們的信息是共享的,反之,它們就是自立獨立的,就像兩個應用程序域一樣,它們之間是不能相互通訊的.

 回到目錄

posted @ 2014-05-12 16:50  張占嶺  閱讀(1873)  評論(0)    收藏  舉報