Session共享的解決方案
原文地址:https://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html
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;
#region IHttpModule Members
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 < app.Context.Response.Cookies.Count; i++)
{
if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
{
app.Context.Response.Cookies[i].Domain = m_RootDomain;
}
}
}
#endregion
}
為使用以上代碼,須配置下面節點項。
<httpModules>
<add name="節點名稱" type="類名全稱, 程序集"/>
</httpModules>
2、Session值的共享;
配置sessionState置節點,使用StateServer或SQLServer來實現Session共享。
為實現跨服務器共享,必須在Web.config配置:
<machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
並且,不同服務器上站點配置必須用相同的Web.config,各站點目錄配置也要相同。
2.1、使用StateServer:
存儲Session的服務器必須開啟StateServer:ASP.NET狀態服務。只有機器重起的情況下才導致Session丟失。
<sessionState cookieless="false" timeout="50" mode="StateServer" stateConnectionString="tcpip=IpAddress:42424"/>
若StateServer在本機存儲,則IpAddress為:127.0.0.1;若StateServer為遠程服務器,則為IpAddress為遠程服務器IP地址,並且修改註冊表項如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters]
"Port"=dword:0000a5b8
"AllowRemoteConnection"=dword:00000001
2.2、使用SQLServer:
必須開啟SQLServer代理服務,此服務負責清除過期的Session,若沒有開服務,則Session不會過期。
使用SQLServer在機器重啟後Session不會丟失。
Web.config配置:
<sessionState mode="SQLServer" sqlConnectionString="server=DBIpAddress; uid=myid; pwd=mypwd;"/>
數據庫配置:
使用aspnet_regsql.exe工具
ASP.NET 2.0版本後微軟提供了aspnet_regsql.exe工具可以方便的配置Session數據庫.該工具位於 Web 服務器上的"系統根目錄\Microsoft.NET\Framework\版本號"文件夾中.
使用舉例:
aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p
-S參數:
表示數據庫實例名稱. 可以用"."表示本機.
-U和-P參數:
表示用戶名和密碼.
-E參數:
可以再-U –P 與 -E中選擇一組. –E表示以當前系統用戶通過windows身份驗證登錄數據庫, -U -P則是使用SqlServer用戶登錄數據庫.
-ssadd / –ssremove 參數:
-ssadd表示是添加Session數據庫, -ssremove表示移除Session數據庫.
sstype 參數說明:
t |
將會話數據存儲到 SQL Server tempdb 數據庫中。這是默認設置。如果將會話數據存儲到 tempdb 數據庫中,則在重新啟動 SQL Server 時將丟失會話數據。 |
p |
將會話數據存儲到 ASPState 數據庫中,而不是存儲到 tempdb 數據庫中。 |
c |
將會話數據存儲到自定義數據庫中。如果指定 c 選項,則還必須使用 -d 選項包括自定義數據庫的名稱。 |
sessionState參數說明:
屬性 |
說明 |
||||||||||||
allowCustomSqlDatabase |
可選的 Boolean 屬性。 指定會話狀態 SQL 數據庫是否可以是自定義數據庫(而不是 ASP.NET 默認數據庫)。如果為 false,則不能指定初始目錄或數據庫作為 sqlConnectionString 屬性的值。默認會話狀態 SQL 數據庫為 ASPState 數據庫。有關更多信息,請參見會話狀態模式。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 false。 |
||||||||||||
cookieless |
可選的 HttpCookieMode 屬性。 指定對於 Web 應用程序使用 Cookie 的方式。 cookieless 屬性可以為下列可能值之一。默認值為 UseCookies。
|
||||||||||||
cookieName |
可選的 String 屬性。 指定存儲會話標識符的 Cookie 的名稱。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 "ASP.NET_SessionId"。 |
||||||||||||
customProvider |
可選的 String 屬性。 指定用於存儲和檢索會話狀態數據的自定義會話狀態提供程序的名稱。該提供程序在 providers 元素中指定。僅當會話狀態模式設置為 Custom 值時,才使用該提供程序。有關更多信息,請參見會話狀態模式。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為空字符串 ("")。 |
||||||||||||
mode |
可選的 SessionStateMode 屬性。 指定存儲會話狀態值的位置。有關更多信息,請參見會話狀態模式。 mode 屬性可以為下列可能值之一。默認值為 InProc。
|
||||||||||||
partitionResolverType |
可選的 String 屬性。 指定在哪裏存儲會話狀態。如果 partitionResolverType 屬性中指定了值,則忽略 sqlConnectionString 和 stateConnectionString 屬性。PartitionResolverType 屬性返回的連接字符串將用於每個請求,為請求的其余部分連接到適當的服務器位置。如果連接字符串無效,ASP.NET 將引發一個異常,該異常與當配置的服務器連接字符串無效時引發的異常相同。該屬性用於在 SQL 或狀態服務器模式下在多個後端節點上劃分會話狀態數據。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為空字符串。 |
||||||||||||
regenerateExpiredSessionId |
可選的 Boolean 屬性。 指定當客戶端指定了過期的會話 ID 時是否重新發出會話 ID。默認情況下,當啟用了 regenerateExpiredSessionId 時,僅為 cookieless 模式重新發出會話 ID。有關更多信息,請參見 IsCookieless。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 true。 |
||||||||||||
sqlCommandTimeout |
可選的 TimeSpan 屬性。 指定使用 SQL Server 會話狀態模式的 SQL 命令的持續時間超時(秒)。持續時間超時是 SQL 命令可以處於空閑狀態的時間(秒),超過此時間之後,該命令將被取消。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 0:00:30(30 秒)。 |
||||||||||||
sqlConnectionString |
可選的 String 屬性。 為運行 SQL Server 的計算機指定連接字符串。該屬性在 mode 屬性設置為 SQLServer 值時是必需的。有關更多信息,請參見會話狀態模式。
默認值為 "data source=127.0.0.1;Integrated Security=SSPI"。 |
||||||||||||
stateConnectionString |
可選的 String 屬性。 指定遠程存儲會話狀態的服務器名稱或地址以及端口。端口值必須為 42424。當 mode 為 StateServer 值時,該屬性是必需的。確保運行 ASP.NET 狀態服務的服務器是存儲會話狀態信息的遠程服務器。該服務隨 ASP.NET 一起安裝,默認情況下為 %SystemRoot%\Microsoft.NET\Framework\VersionNumber\aspnet_state.exe。有關更多信息,請參見會話狀態模式。
默認值為 "tcpip=127.0.0.1:42424"。 |
||||||||||||
stateNetworkTimeout |
可選的 TimeSpan 屬性。 指定 Web 服務器與狀態服務器之間的 TCP/IP 網絡連接可以處於空閑狀態的時間(秒),超過此時間後,請求將被取消。該屬性在 mode 屬性設置為 StateServer 值時使用。 默認值為 10 秒。 |
||||||||||||
timeout |
可選的 TimeSpan 屬性。 指定在放棄一個會話前該會話可以處於空閑狀態的分鐘數。對於進程內和狀態服務器模式,timeout 屬性不能設置為大於 525,601 分鐘(1 年)的值。 會話 timeout 配置設置僅適用於 ASP.NET 頁。更改會話 timeout 值不會影響 ASP 頁的會話超時時間。同樣,更改 ASP 頁的會話超時時間不會影響 ASP.NET 頁的會話超時時間。 默認值為 20 分鐘。 |
||||||||||||
useHostingIdentity |
可選的 Boolean 屬性。 指定會話狀態將恢復為宿主標識還是使用客戶端模擬。 如果為 true,ASP.NET 將使用下列進程憑據之一來連接會話狀態存儲區: 宿主進程;對於 Microsoft Internet 信息服務 [IIS] 5 和 5.1 版為 ASPNET,對於 Microsoft Windows Server 2003 則為 NETWORK SERVICE。 應用程序模擬標識,當使用了以下配置時使用此憑據: <identity impersonate="true" userName="user" password="pwd" /> 如果為 false,ASP.NET 將使用目前與當前請求的操作系統線程關聯的憑據來連接會話狀態存儲區。對於客戶端模擬,ASP.NET 將使用與瀏覽器協商的安全憑據來連接會話狀態存儲區。如果為 false,ASP.NET 在連接會話狀態存儲區時不會恢復為進程標識或應用程序模擬標識。有關更多信息,請參見 ASP.NET 模擬。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 true。
|
||||||||||||
繼承的屬性 |
可選的屬性。 由所有節元素繼承的屬性。 |
Session共享的解決方案