海水正藍(lán)

          面朝大海,春暖花開
          posts - 145, comments - 29, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          多站點(diǎn)共享Session常見的作法有:

          • 使用.net自動(dòng)的狀態(tài)服務(wù)(Asp.net State Service);
          • 使用.net的Session數(shù)據(jù)庫(kù);
          • 使用Memcached。
          • 使用Cookie方式實(shí)現(xiàn)多個(gè)站點(diǎn)間的共享(這種方式只限于幾個(gè)站點(diǎn)都在同一域名的情況下); 

          這里我們就 演練一下 以數(shù)據(jù)庫(kù)的形來(lái)存儲(chǔ)Session,來(lái)實(shí)現(xiàn)多站點(diǎn)共享Session。 

          首先我們 建好一下站點(diǎn),如下圖: 

           

          Default.aspx 

          其中 有二個(gè)Button  ,SetSession 主要是用于給一個(gè) Session 賦值(如:Session["ShareValue"] = “abcd”

          ) ,

          GetSession 主要就是獲得 一個(gè) Session 值。

          具體代碼如下:

            

           代碼部分就這么多就行了…

           

          下面就是要配置一下 Web.config了 , 其實(shí)主要就是在 <system.web>

           這個(gè)節(jié)點(diǎn)中 增加 machineKey 及 sessionState 這兩個(gè)節(jié)點(diǎn),

          1.增加machineKey 主要作用是:

          “按照MSDN的標(biāo)準(zhǔn)說(shuō)法:“對(duì)密鑰進(jìn)行配置,以便將其用于對(duì) Forms 身份驗(yàn)證 Cookie 數(shù)據(jù)和視圖狀態(tài)數(shù)據(jù)進(jìn)行加密和解密,并將其用于對(duì)進(jìn)程外會(huì)話狀態(tài)標(biāo)識(shí)進(jìn)行驗(yàn)證。”也就是說(shuō)Asp.Net的很多加密,都是依賴于machineKey里面 的值,例如Forms 身份驗(yàn)證 Cookie、ViewState的加密。默認(rèn)情況下,Asp.Net的配置是自己動(dòng)態(tài)生成,如果單臺(tái)服務(wù)器當(dāng)然沒(méi)問(wèn)題,但是如果多臺(tái)服務(wù)器負(fù)載均 衡,machineKey還采用動(dòng)態(tài)生成的方式,每臺(tái)服務(wù)器上的machinekey值不一致,就導(dǎo)致加密出來(lái)的結(jié)果也不一致,不能共享驗(yàn)證和 ViewState,所以對(duì)于多臺(tái)服務(wù)器負(fù)載均衡的情況,一定要在每臺(tái)站點(diǎn)配置相同的machineKey。“ ,具體可以查一下其它資料。

          2.增加 sessionState 主要是讓 Session 保存在數(shù)據(jù)庫(kù)中。 

          具體配置如下:

          <machineKey validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54" decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046" validation="SHA1" decryption="AES"/>
           
          <sessionState mode="SQLServer" sqlConnectionString="Data Source=PC-07195;Initial Catalog=AWBUISession;Persist Security Info=True;User ID=jins;Password=js@#$1234" allowCustomSqlDatabase="true" cookieless="false" timeout="100"/>

          網(wǎng)站部分 這樣就好了。。。 下面就是要配置據(jù)庫(kù)了…..

          數(shù)據(jù)庫(kù)配置:

          使用aspnet_regsql.exe工具

          ASP.NET 2.0版本后微軟提供了aspnet_regsql.exe工具可以方便的配置Session數(shù)據(jù)庫(kù).該工具位于 Web 服務(wù)器上的"系統(tǒng)根目錄\Microsoft.NET\Framework\版本號(hào)"文件夾中.

          使用舉例:

          aspnet_regsql.exe -S . -U sa -123456 -ssadd -sstype p
          -S參數(shù):

          表示數(shù)據(jù)庫(kù)實(shí)例名稱. 可以用"."表示本機(jī).

          -U和-P參數(shù):

          表示用戶名和密碼.

          -E參數(shù):

          可以再-U –P 與 -E中選擇一組. –E表示以當(dāng)前系統(tǒng)用戶通過(guò)windows身份驗(yàn)證登錄數(shù)據(jù)庫(kù), -U -P則是使用SqlServer用戶登錄數(shù)據(jù)庫(kù).

          -ssadd / –ssremove 參數(shù):

          -ssadd表示是添加Session數(shù)據(jù)庫(kù), -ssremove表示移除Session數(shù)據(jù)庫(kù).

          sstype 參數(shù)說(shuō)明:

          t

          將會(huì)話數(shù)據(jù)存儲(chǔ)到 SQL Server tempdb 數(shù)據(jù)庫(kù)中。這是默認(rèn)設(shè)置。如果將會(huì)話數(shù)據(jù)存儲(chǔ)到 tempdb 數(shù)據(jù)庫(kù)中,則在重新啟動(dòng) SQL Server 時(shí)將丟失會(huì)話數(shù)據(jù)。

          p

          將會(huì)話數(shù)據(jù)存儲(chǔ)到 ASPState 數(shù)據(jù)庫(kù)中,而不是存儲(chǔ)到 tempdb 數(shù)據(jù)庫(kù)中。

          c

          將會(huì)話數(shù)據(jù)存儲(chǔ)到自定義數(shù)據(jù)庫(kù)中。如果指定 c 選項(xiàng),則還必須使用 -d 選項(xiàng)包括自定義數(shù)據(jù)庫(kù)的名稱。

          我的設(shè)置是:aspnet_regsql.exe -S . - E -d AWBUISession -ssadd -sstype c 

           

          好了?;镜?我們就已經(jīng)搞定了。。

          現(xiàn)在 我們分別把我們剛建的一個(gè)網(wǎng)站 部署 到 IIS 中。不過(guò)我們既然要負(fù)載。至少也的部署兩份

          我們把 其中一個(gè) 服務(wù)器中的 defaut.aspx 中 “服務(wù)器 1” 改成 “服務(wù)器 2” ,這樣做的主要目地是 做一下 區(qū)別! 

          具體如下:

          兩個(gè)網(wǎng)站的 URL分別是:

           server 1:127.0.0.1:8081;

          server 2:127.0.0.1:8080;   

          OK。下面我們就是 配置 Nignx了。

          首先 在 nginx\conf 配置  文件中找到 nginx.conf 這個(gè)文件 ,就記事本打開,

          做如上的 設(shè)置:

          OK。  nginx  這樣配置 就算OK 了。 我們啟動(dòng)一下 nginx ..

          在瀏覽器中 輸入我們 在 nginx 中配置的 URL 如:127.0.0.1:8090

          我們會(huì)看到 服務(wù)器 1 已經(jīng)開始為我們服務(wù)了,我們?cè)冱c(diǎn)一下 “SetSession”來(lái)設(shè)置一下一個(gè) 會(huì)話值,
          我們會(huì)看到 服務(wù)器 2 開始 工作。這時(shí)我們?cè)冱c(diǎn)一下 “GetSesion”看一下 剛才在 服務(wù)器 1 設(shè)置 的會(huì)話值,結(jié)果如下 :
          出現(xiàn)這種情況 ,主要就是在數(shù)據(jù)庫(kù)中存儲(chǔ) 一個(gè)會(huì)話時(shí) 沒(méi)有做到 服務(wù)器1 和服務(wù)2的Session 共享,主要是 在ASPStateTempSessions 這個(gè)表中的 一個(gè)SessionID,其中的SessionId包括兩個(gè)部分:網(wǎng)站生成的24位SessionID及8位AppName對(duì)于不同的站點(diǎn),其AppName不同,在能夠在不同站點(diǎn)下使24位SessionID相同的情況下,要保證經(jīng)過(guò)組合加上AppName后的SessionID相同,可以通過(guò)修改存儲(chǔ)過(guò)程TempGetAppID,使其得到的SessionID與AppName無(wú)關(guān),修改TempGetAppID如下:

          ALTER PROCEDURE [dbo].[TempGetAppID]
              
          @appName    tAppName,
              
          @appId      int OUTPUT
              
          AS
              
          SET @appName = 'Test' --LOWER(@appName) 修改這里,使多個(gè)站點(diǎn)的APPname ,為一個(gè)固定值。
              SET @appId = NULL
              
          SELECT @appId = AppId
              
          FROM [AWBUISession].dbo.ASPStateTempApplications
              
          WHERE AppName = @appName
              
          IF @appId IS NULL BEGIN
                  
          BEGIN TRAN
                  
          SELECT @appId = AppId
                  
          FROM [AWBUISession].dbo.ASPStateTempApplications WITH (TABLOCKX)
                  
          WHERE AppName = @appName
                  
          IF @appId IS NULL
                  
          BEGIN
                      
          EXEC GetHashCode @appName@appId OUTPUT
                      
          INSERT [AWBUISession].dbo.ASPStateTempApplications
                      
          VALUES
                      (
          @appId@appName)
                      
          IF @@ERROR = 2627
                      
          BEGIN
                          
          DECLARE @dupApp tAppName
                          
          SELECT @dupApp = RTRIM(AppName)
                          
          FROM [AWBUISession].dbo.ASPStateTempApplications
                          
          WHERE AppId = @appId
                          
          RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.'181@appName@dupApp)
                      
          END
                  
          END
                  
          COMMIT
              
          END
              
          RETURN 0   
          經(jīng)過(guò)以上修改之后,下面要實(shí)現(xiàn)多個(gè)站點(diǎn)共用同一個(gè)SessionID.

          重啟一下各站點(diǎn)。再在瀏覽一下網(wǎng)站點(diǎn) “SetSession”, 再點(diǎn):“GetSession” 這樣 我們就看到 服務(wù)器2 給出了我們 剛才在 服務(wù)器 1 中設(shè)置 的會(huì)話值了。

          我們 再點(diǎn):“GetSession”,可以看到  服務(wù)器1 和服務(wù)器 2 返回的是相同的結(jié)果,達(dá)到了 “多站點(diǎn)共享Session”
          附加一點(diǎn): Session 過(guò)期刪除,主要是 在 SQL server 代理中的作業(yè)完成,具體的可以,查一下其它相關(guān)資料.

           


          原文出自:
          http://www.cnblogs.com/red-fox/archive/2012/11/05/2755271.html




          評(píng)論

          # re: 【轉(zhuǎn)】nginx 負(fù)載均衡,多站點(diǎn)共享Session  回復(fù)  更多評(píng)論   

          2015-04-12 12:42 by yinbp
          會(huì)話共享的最完美解決方案-bboss會(huì)話共享框架:
          http://yin-bp.iteye.com/category/327553

          無(wú)需關(guān)心session數(shù)據(jù)序列化問(wèn)題,
          無(wú)需session 粘連機(jī)制,
          跨域跨應(yīng)用session共享,
          跨容器 (tomcat,jetty,weblogic)共享session,
          sso單點(diǎn)登入單點(diǎn)登出一致性保證
          輕松地切換到容器會(huì)話管理機(jī)制
          完美的在線會(huì)話監(jiān)控管理功能

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 龙山县| 镇原县| 海伦市| 宣威市| 华容县| 旬邑县| 阜城县| 杭锦后旗| 钟山县| 昌平区| 海兴县| 常州市| 扎鲁特旗| 宜昌市| 鲁山县| 项城市| 木兰县| 内丘县| 石嘴山市| 特克斯县| 灵寿县| 芮城县| 陆川县| 长岛县| 闻喜县| 四会市| 桦南县| 柏乡县| 方城县| 凤山市| 禹州市| 江达县| 运城市| 漳州市| 达州市| 绥江县| 中西区| 海晏县| 龙胜| 宁河县| 鄂尔多斯市|