對于一個有點規模的網站,都會有各個子網站,說是子網站,其實也都是獨立的站點,一般通過二次域名來分開,如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的唯一標示,這個值如果相同,服務器就會認為,你的網站是在同一個域下的,它們的信息是共享的,反之,它們就是自立獨立的,就像兩個應用程序域一樣,它們之間是不能相互通訊的.
文章列表