.NET二级域名共享Session
生活随笔
收集整理的這篇文章主要介紹了
.NET二级域名共享Session
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ASP.NET二級域名站點共享Session狀態(tài)今天, 我要寫的是如何在二級域名站點之間,主站點和二級域名站點之間共享Session。首先, Session要共享,站點之間SessionID必須要一致,那怎么保證SessionID一致呢?ASP.NET中的SessionID是存儲在客戶端的cookie之中鍵值為ASP.NET_SessionId用來維護(hù)瀏覽者Session對應(yīng)關(guān)系的一個字符串,要想在二級域名站點之間,主站點和二級域名站點共享SessionID就必須先共享,那么我們就必須先實現(xiàn)ASP.NET_SessionId這一cookie的共享。A: CrossDomainCookieModule------------------------------------------------------------------------------------------------public class CrossDomainCookie : IHttpModule{private string m_RootDomain = string.Empty;#region IHttpModule Memberspublic 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重設(shè)了所有cookie的domain到root domain, root domain在web.config中設(shè)置。也許有人會說這是眉毛胡子一把抓重寫了所有cookie的domain, 那他也可以判斷一下cookie的name, 如果為ASP.NET_SessionId的話才重寫。如果主站點和二級域名站點是同一站點,那么做到這一步,你的session就已經(jīng)共享了,因為Session的ID是相同的,而且Session容器也是同一個。如果主站點和二級域名站點是兩個不同站點,則需要進(jìn)行更多的操作了。如果兩個站點是不同的服務(wù)器的話,解決方法要簡單點:1) 使用相同的state server來存儲Session.2) 在兩個站點的web.config設(shè)置相同的machineKey.<machineKeyvalidationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4"decryptionKey="5FC88DFC24EA123C"validation="SHA1"/>MachineKey的設(shè)置請參考http://msdn.microsoft.com/zh-cn/asp.net/w8h3skw9.aspx3) 給兩個站點設(shè)置相同name這樣做是為了確保兩個站點的siteID相同,siteID是site name的hash值,注意請不要使用默認(rèn)站點,因為默認(rèn)站點的siteID并非site name的hash.如果兩個站點是在同一的服務(wù)器的話,需要對CrossDomainCookie再作一下修改,此方法也可應(yīng)用于兩個站點在不同服務(wù)器的情況:1) 使用相同的state server來存儲Session.2) 用反射來設(shè)置System.Web.SessionState.OutOfProcSessionStateStore的靜態(tài)字段s_uribase的值public class CrossDomainCookie : IHttpModule{private string m_RootDomain = string.Empty;#region IHttpModule Memberspublic 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}完成這樣的修改之后就可以實現(xiàn)Session的共享了。同樣如果你是使用SQL server來存儲Session, 也可以使用類似的方法來解決Session共享問題。來源:Diy綜合信息網(wǎng).NET二級域名共享Session
?
總結(jié)
以上是生活随笔為你收集整理的.NET二级域名共享Session的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一个小算法(Shell Sort1)
- 下一篇: juc线程池原理(六):jdk线程池中的