Session共享的解決方案
1、客戶端SessionID值唯一;
對於不同的域名:主域名、子域名、跨站點域名或跨伺服器域名,使用者在開啟頁面時會產生不同的SessionID,
為了使這些站點在使用者登入時只登入一次,那我們就要解決SessionID的問題,必須使SessionID在這些共享Session的站點中只產生一次。而SessionID是儲存在客戶端的cookie之中鍵值為ASP.NET_SessionId的一個字串(也可以儲存在URL中,這裡不作使介紹),為此只須使各站點儲存的SP.NET_SessionId唯一即可。
因每個客戶端在開啟時會產生一個SessionID,為此我們要做的就是重置SessionID。我們可以在繼承HttpModule,在結束請求時重寫SessionID
程式碼:
public class MakeSessionIDOneOnly : IHttpModule
{
private string m_RootDomain = string.Empty;
public 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
if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
app.Context.Response.Cookies[i].Domain = m_RootDomain;
為使用以上程式碼,須配置下面節點項。
Session共享的解決方案
1、客戶端SessionID值唯一;
對於不同的域名:主域名、子域名、跨站點域名或跨伺服器域名,使用者在開啟頁面時會產生不同的SessionID,
為了使這些站點在使用者登入時只登入一次,那我們就要解決SessionID的問題,必須使SessionID在這些共享Session的站點中只產生一次。而SessionID是儲存在客戶端的cookie之中鍵值為ASP.NET_SessionId的一個字串(也可以儲存在URL中,這裡不作使介紹),為此只須使各站點儲存的SP.NET_SessionId唯一即可。
因每個客戶端在開啟時會產生一個SessionID,為此我們要做的就是重置SessionID。我們可以在繼承HttpModule,在結束請求時重寫SessionID
程式碼:
public class MakeSessionIDOneOnly : IHttpModule
{
private string m_RootDomain = string.Empty;
public 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
{
if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
{
app.Context.Response.Cookies[i].Domain = m_RootDomain;
}
}
}
}
為使用以上程式碼,須配置下面節點項。