1. 程式人生 > >Session共享的解決方案

Session共享的解決方案

包括 command time 屬性 context string blank padding 節點

原文地址: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。

說明

AutoDetect

ASP.NET 確定請求瀏覽器或請求設備是否支持 Cookie。如果請求瀏覽器或請求設備支持 Cookie,則 AutoDetect 使用 Cookie 來保留用戶數據;否則,將在查詢字符串中使用一個標識符。如果瀏覽器或設備支持 Cookie,但當前禁用了 Cookie,則請求功能仍會使用 Cookie。

UseCookies

無論瀏覽器或設備是否支持 Cookie,都使用 Cookie 來保留用戶數據。

UseDeviceProfile

ASP.NET 根據 HttpBrowserCapabilities 設置來確定是否使用 Cookie。如果 HttpBrowserCapabilities 設置指示瀏覽器或設備支持 Cookie,將使用 Cookie;否則,將在查詢字符串中使用一個標識符。

UseUri

無論瀏覽器或設備是否支持 Cookie,調用功能都使用查詢字符串來存儲標識符。

cookieName

可選的 String 屬性。

指定存儲會話標識符的 Cookie 的名稱。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值為 "ASP.NET_SessionId"。

customProvider

可選的 String 屬性。

指定用於存儲和檢索會話狀態數據的自定義會話狀態提供程序的名稱。該提供程序在 providers 元素中指定。僅當會話狀態模式設置為 Custom 值時,才使用該提供程序。有關更多信息,請參見會話狀態模式。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值為空字符串 ("")。

mode

可選的 SessionStateMode 屬性。

指定存儲會話狀態值的位置。有關更多信息,請參見會話狀態模式。

mode 屬性可以為下列可能值之一。默認值為 InProc。

說明

Custom

會話狀態將使用自定義數據存儲區來存儲會話狀態信息。

InProc

會話處於正在處理 ASP.NET 輔助進程的狀態。

Off

會話狀態被禁用。

SQLServer

會話狀態將使用進程外 SQL Server 數據庫來存儲狀態信息。

StateServer

會話狀態將使用進程外 ASP.NET 狀態服務來存儲狀態信息。

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 值時是必需的。有關更多信息,請參見會話狀態模式。

註意

若要在使用 SQLServer 模式時提高您的應用程序的安全性,請使用受保護的配置來加密配置的 sessionState 節,以幫助保護 sqlConnectionString 值。

默認值為 "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。有關更多信息,請參見會話狀態模式。

註意

若要在使用 StateServer 模式時提高您的應用程序的安全性,請使用受保護的配置來加密配置的 <sessionState> 節,以幫助保護 stateConnectionString 值。

默認值為 "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。

註意

在 .NET Framework 1.1 版中,如果 mode 屬性設置為 SQLServer,並且客戶端模擬有效,則 ASP.NET 使用來自 ASP.NET 客戶端模擬的客戶端憑據連接到運行 SQL Server 的計算機。

繼承的屬性

可選的屬性。

由所有節元素繼承的屬性。

Session共享的解決方案