session過期時間設(shè)置說明
session 過期時間設(shè)置說明一. 系統(tǒng)session 配置說明針對承保(prpall)、雙核(undwrt)系統(tǒng)中,有兩個配置文件可以設(shè)置session 的過期時間 分別是web.xml 和we
session 過期時間設(shè)置說明
一. 系統(tǒng)session 配置說明
針對承保(prpall)、雙核(undwrt)系統(tǒng)中,有兩個配置文件可以設(shè)置session 的過期時間 分別是web.xml 和weblogic.xml
Web.xml 中配置
時間單位是一分鐘,并且只能是整數(shù),如果是零或負數(shù),那么會話就永遠不會超時。 此例表示Session 將在60分鐘后過期
weblogic.xml 中設(shè)置的TimeoutSecs 屬性值。
Weblogic.xml 中配置
時間單位是一秒鐘,表示1800秒后失效。
1. 如果兩個配置文件中都有配置,且Weblogic.xml 中配置的秒數(shù)必須可以被60整除,(如60,120等) 。則按照時間最小的那個為準(zhǔn)。
2. 如果兩個配置文件中都有配置, 且Weblogic.xml 中配置的秒數(shù)必須不可以被60整除(如,45,90等)。則以web.xml 設(shè)置的時間為準(zhǔn)。
3. 如果web.xml 文件中沒有設(shè)置,且Weblogic.xml 中有配置。則按照Weblogic.xml 的設(shè)置為準(zhǔn)。
4. 為保證session 的唯一性,在weblogic 環(huán)境下,建議只在weblogic.xml 中設(shè)置。防止出現(xiàn)沖突。
,二. 疑問
1. web.xml,weblogic.xml 同時配置時,為什么會是以時間小的為準(zhǔn)? 暫時無解。
2. 對應(yīng)的weblogic.xml 必須配置為分鐘的整數(shù)倍?
如web=2m weblogic=90s,最終為以web 為準(zhǔn)。
web=3m weblogic=120s 以 weblogic為準(zhǔn)
暫時無解。
3. 關(guān)于“WEB-INF/config/appconfig/SysConstConfig.xml” 中的session 時效時間。 從目前情況看, SysConstConfig.xml 這個應(yīng)該沒有使用;那么就是 web.xml 與weblogic.xml 這兩個的配置用誰的問題了。
按網(wǎng)上說法,對應(yīng)的優(yōu)先級應(yīng)該是:自定義xml 配置的session>web.xml>weblogic.xml;個人理解為:自定義的配置最高的原因是因為,我們程序?qū)崿F(xiàn)判斷session 時去讀取了這個時間;對于web.xml>weblogic.xml,從上述的測試過程中發(fā)現(xiàn)并不是如此。
三. 配置session 方式
WebLogic 如何設(shè)置session 超時時間
1 web.xml
設(shè)置WEB 應(yīng)用程序描述符web.xml 里的
此例表示Session 將在54分鐘后過期
當(dāng)
TimeoutSecs 這個屬性值。
當(dāng)
weblogic.xml 中設(shè)置的TimeoutSecs 屬性值。
該屬性值可以通過console 控制臺來設(shè)置
2 weblogic.xml
設(shè)置WebLogic 特有部署描述符weblogic.xml 的
默認值是3600秒
3,jsp 中控制
session.setmaxinactiveinterval(7200);
session 是默認對象, 可以直接引用, 單位秒s
4,servlet 中控制
session.setmaxinactiveinterval(7200);
單位秒s
在weblgoic 的console 中:xxDomain ->Servers->xxServer->Protocols->HTTP 中有一個關(guān)于Post Timeout的配置,但這個參數(shù)一般使用默認值即可
一般是通過Services-->JDBC-->Connection Pools-->MyConnection(你所建立的連接池名) -->Configration-->Connections 里的Inactive Connection Timeout這個參數(shù)來設(shè)置的,默認的為0,表示連接時間無限長。你可以設(shè)一個時間值,連接超過這個時間值,它會把連接強制放回連接池
CompleteMessageTimeout="480" IdleConnectionTimeout="600" ListenAddress="" ListenPort="7001" Name="myserver" NativeIOEnabled="true" ReliableDeliveryPolicy="RMDefaultPolicy" ServerVersion="8.1.4.0"> 是否IdleConnectionTimeout 參數(shù) 看連接池中高級選項內(nèi)的Inactive Connection Timeout和Connection Reserve Timeout時多少, 把這兩項設(shè)大些試試 如果在兩個文件中同時設(shè)置了超時時間,則會以web.xml 中為準(zhǔn)。 所以在weblogic 環(huán)境中,最好將web.xml 中關(guān)于超時的設(shè)置刪掉,保持唯一性。 如果使用WEBLOGIC 作為應(yīng)用服務(wù)器,設(shè)置SESSION 超時時間會選擇在WEBLOGIC 的控制臺設(shè)定。實際上,WEBLOGIC 是將超時設(shè)定保存在WEB-INF 下的weblogic.xml 中,格式如下: param-value 中的數(shù)值就是超時時間,單位為秒。在設(shè)置完這個參數(shù)后,會發(fā)現(xiàn)超時時間并一定起效。這是為什么呢? 原來在WEB-INF 下還有一個配置文件web.xml ,里面同樣會有一段設(shè)置session ,格式如下: session-timeout 中的值也是超時時間,單位為分鐘。 如果在兩個文件中同時設(shè)置了超時時間,則會以web.xml 中為準(zhǔn)。 所以在weblogic 環(huán)境中,最好將web.xml 中關(guān)于超時的設(shè)置刪掉,保持唯一性。 這也是發(fā)現(xiàn)了問題后,多次實驗后發(fā)現(xiàn)的。 以下問題: ueue: ‘billproxyqueue ’ has been busy for “727″ seconds working on the request “Http Request: /bill/y nQueryPublic.go ”, which is more than the configured time (StuckThreadMaxTime) of “600″ seconds.> 一看明顯是連接超時, 導(dǎo)致的錯誤. 程序問題, 是不是程序中沒有關(guān)閉連接 如果程序沒問題, 則是weblogic 的StuckThreadMaxTime 設(shè)置過小而引起的, 一般weblogic server 的StuckThreadMaxTime 默認參數(shù)是600s, 即10分鐘, 如果并發(fā)量過大, 而導(dǎo)致等待處理過多, 導(dǎo)致系統(tǒng)不停的增加線程,造成線程阻塞,你可以把該參數(shù)設(shè)置大點這個是稍微調(diào)大StuckThreadMaxTime 的參數(shù)即可. 看線程數(shù)設(shè)置, 可適當(dāng)增加線程數(shù),這個在WLS 控制臺中可以調(diào)整 四. 關(guān)于session 通過 在weblgoic 的console 中配置的補 充: 在weblogic10R3 中配置方法: 登錄console 之后,部署>選擇對應(yīng)的應(yīng)用(如 undwrt)>配置>改完后保存,會另存為其他的xml 文件,如下圖流程。 五. s ession 與cookie 的詳細說明 具體來說cookie 機制采用的是在客戶端保持狀態(tài)的方案,而session 機制采用的是在服務(wù)器端保持狀態(tài)的方案 同時我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個標(biāo)識,所以session 機制可能需要借助于cookie 機制來達到保存標(biāo)識的目的,但實際上它還有其他選擇。 cookie 的內(nèi)容主要包括:名字,值,過期時間,路徑和域。 其中域可以指定某一個域比如.google.com ,相當(dāng)于總店招牌,比如寶潔公司,也可以指定一個域下的具體某臺機器比如www.google.com 或者froogle.google.com ,可以用飄柔來做比。 路徑就是跟在域名后面的URL 路徑,比如/或者/foo等等,可以用某飄柔專柜做比。 路徑與域合在一起就構(gòu)成了cookie 的作用范圍。 如果不設(shè)置過期時間,則表示這個cookie 的生命期為瀏覽器會話期間,只要關(guān)閉瀏覽器窗口,cookie 就消失了。這種生命期為瀏覽器會話期的 cookie被稱為會話cookie 。會話cookie 一般不存儲在硬盤上而是保存在內(nèi)存里,當(dāng)然這種行為并不是規(guī)范規(guī)定的。如果設(shè)置了過期時間,瀏覽器就會把cookie 保存到硬盤上,關(guān)閉后再次打開瀏覽器,這些cookie 仍然有效直到超過設(shè)定的過期時間。 存儲在硬盤上的cookie 可以在不同的瀏覽器進程間共享,比如兩個IE 窗口。而對于保存在內(nèi)存里的cookie ,不同的瀏覽器有不同的處理方式。對于IE ,在一個打開的窗口上按Ctrl-N (或者從文件菜單)打開的窗口可以與原窗口共享,而使用其他方式新開的IE 進程則不能共享已經(jīng)打開的窗口的內(nèi)存cookie ;對于Mozilla Firefox0.8,所有的進程和標(biāo)簽頁都可以共享同樣的cookie 。一般來說是用javascript 的window.open 打開的窗口會與原窗口共享內(nèi)存cookie 。瀏覽器對于會話cookie 的這種只認cookie 不認人的處理方式經(jīng)常給采用session 機制的web 應(yīng)用程序開發(fā)者造成很大的困擾。 [經(jīng)典的語錄] 下面就是一個goolge 設(shè)置cookie 的響應(yīng)頭的例子 HTTP/1.1 302 Found Location: http://www.google.com/intl/zh-CN/ Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com Content-Type: text/html 到時候我們的域就要設(shè)置為domain=.*****.cn path=/ session 機制是一種服務(wù)器端的機制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來保存信息。 四、理解session 機制 session 機制是一種服務(wù)器端的機制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來保存信息。 當(dāng)程序需要為某個客戶端的請求創(chuàng)建一個session 的時候,服務(wù)器首先檢查這個客戶端的請求里是否已包含了一個session 標(biāo)識 - 稱為session id,如果已包含一個session id則說明以前已經(jīng)為此客戶端創(chuàng)建過session ,服務(wù)器就按照session id把這個session 檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創(chuàng)建一個session 并且生成一個與此session 相關(guān)聯(lián)的session id,session id的值應(yīng)該是一個既不會重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個session id將被在本次響應(yīng)中返回給客戶端保存。 保存這個session id 的方式可以采用cookie ,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標(biāo)識發(fā)揮給服務(wù)器。一般這個cookie 的名字都是類似于 SEEESIONID,而。比如weblogic 對于web 應(yīng)用程序生成的 cookie, J SESSION ID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是J SESSION ID 。 由于cookie 可以被人為的禁止,必須有其他機制以便在cookie 被禁止時仍然能夠把session id 傳遞回服務(wù)器。經(jīng)常被使用的一種技術(shù)叫做URL 重寫,就是把session id 直接附加在URL 路徑的后面,附加方式也有兩種,一種是作為URL 路徑的附加信息,表現(xiàn)形式為http://..... /xxx;jsession id=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 另一種是作為查詢字符串附加在URL 后面,表現(xiàn)形式為 這兩種方式對于用戶來說是沒有區(qū)別的,只是服務(wù)器在解析的時候處理的方式不同,采用第一種方式也有利于把session id的信息和正常程序參數(shù)區(qū)分開來。 為了在整個交互過程中始終保持狀態(tài),就必須在每個客戶端可能請求的路徑后面都包含這個session id。 另一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務(wù)器。比如下面的表單

在被傳遞給客戶端之前將被改寫成
這種技術(shù)現(xiàn)在已較少應(yīng)用,筆者接觸過的很古老的iPlanet6(SunONE應(yīng)用服務(wù)器的前身) 就使用了這種技術(shù)。
實際上這種技術(shù)可以簡單的用對action 應(yīng)用URL 重寫來代替。
,在談?wù)搒ession 機制的時候,常常聽到這樣一種誤解“只要關(guān)閉瀏覽器,session 就消失了”。其實可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session 來說也是一樣的,除非程序通知服務(wù)器刪除一個session ,否則服務(wù)器會一直保留,程序一般都是在用戶做log off 的時候發(fā)個指令去刪除session 。然而瀏覽器從來不會主動在關(guān)閉之前通知服務(wù)器它將要關(guān)閉,因此服務(wù)器根本不會有機會知道瀏覽器已經(jīng)關(guān)閉,之所以會有這種錯覺,是大部分session 機制都使用會話cookie 來保存session id,而關(guān)閉瀏覽器后這個session id就消失了,再次連接服務(wù)器時也就無法找到原來的session 。如果服務(wù)器設(shè)置的cookie 被保存到硬盤上,或者使用某種手段改寫瀏覽器發(fā)出的 HTTP請求頭,把原來的session id發(fā)送給服務(wù)器,則再次打開瀏覽器仍然能夠找到原來的session 。
恰恰是由于關(guān)閉瀏覽器不會導(dǎo)致session 被刪除,迫使服務(wù)器為seesion 設(shè)置了一個失效時間,當(dāng)距離客戶端上一次使用session 的時間超過這個失效時間時,服務(wù)器就可以認為客戶端已經(jīng)停止了活動,才會把session 刪除以節(jié)省存儲空間。
[寫得太精彩了。感受太深了!]
1、session 在何時被創(chuàng)建
一個常見的誤解是以為session 在有客戶端訪問時就被創(chuàng)建,然而事實是直到某server 端程序調(diào)用 HttpServletRequest.getSession(true)這樣的語句時才被創(chuàng)建,注意如果JSP 沒有顯示的使用 <@page session="false"> 關(guān)閉session ,則JSP 文件在編譯成Servlet 時將會自動加上這樣一條語句HttpSession session =
HttpServletRequest.getSession(true);這也是JSP 中隱含的session 對象的來歷。
由于session 會消耗內(nèi)存資源,因此,如果不打算使用session ,應(yīng)該在所有的JSP 中關(guān)閉它。
2、session 何時被刪除
綜合前面的討論,session 在下列情況下被刪除a. 程序調(diào)用HttpSession.invalidate();或b. 距離上一次收到客戶端發(fā)送的session id時間間隔超過了session 的超時設(shè)置; 或c. 服務(wù)器進程被停止(非持久session )
3、如何做到在瀏覽器關(guān)閉時刪除session
嚴(yán)格的講,做不到這一點??梢宰鲆稽c努力的辦法是在所有的客戶端頁面里使用javascript 代碼window.oncolose 來監(jiān)視瀏覽器的關(guān)閉動作,然后向服務(wù)器發(fā)送一個請求來刪除session 。但是對于瀏覽器崩潰或者強行殺死進程這些非常規(guī)手段仍然無能為力。
7、開兩個瀏覽器窗口訪問應(yīng)用程序會使用同一個session 還是不同的session
參見第三小節(jié)對cookie 的討論,對session 來說是只認id 不認人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie 存儲方式都會對這個問題的答案有影響。
8、如何防止用戶打開兩個瀏覽器窗口操作導(dǎo)致的session 混亂
這個問題與防止表單多次提交是類似的,可以通過設(shè)置客戶端的令牌來解決。就是在服務(wù)器每次生成一個不同的id 返回給客戶端,同時保存在session 里,客戶端提交表單時必須把
,這個id 也返回服務(wù)器,程序首先比較返回的id 與保存在 session里的值是否一致,如果不一致則說明本次操作已經(jīng)被提交過了。[對不起你已經(jīng)投過票了!可以這樣來進行控制的哦]
八、總結(jié)
session 機制本身并不復(fù)雜,然而其實現(xiàn)和配置上的靈活性卻使得具體情況復(fù)雜多變。這也要求我們不能把僅僅某一次的經(jīng)驗或者某一個瀏覽器,服務(wù)器的經(jīng)驗當(dāng)作普遍適用的經(jīng)驗,而是始終需要具體情況具體分析。
為什么登陸后, 只要不關(guān)閉瀏覽器,session 就能一直存在? 當(dāng)然session 的數(shù)據(jù)是保存在服務(wù)器上的, 但服務(wù)器是怎么識別這些數(shù)據(jù)都是誰的呢? 答案是sessionid, 每一個瀏覽者都唯一的sessionid, 這就很好的區(qū)分了不同瀏覽者的不同session 了.sessionid 是怎么產(chǎn)生的? 應(yīng)該是第一次訪問服務(wù)器的時候隨即生成的. 假如是111, 然后他的登陸信息是true, 服務(wù)器就知道sessionid 為111已經(jīng)登陸了, 這些信息都存在了服務(wù)器上了. 但當(dāng)瀏覽者繼續(xù)操作的時候, 也就是打開該系統(tǒng)的另一個頁面的時候sessionid 怎么辦? 如何傳遞? 打開另一個頁面的時候其實相當(dāng)于重新訪問系統(tǒng), 如果沒有特殊的處理機制, 系統(tǒng)會再次重新分配一個
sessionid 的, 這樣的話就失去意義了~!所以sessionid 在第一次訪問后應(yīng)該存在了客戶端. 能寸哪呢? 當(dāng)然, 只能寸在cookie 中了, 這就是為什么關(guān)閉cookie,session 就失去作用了
十三、保存session id的幾種方式
A .保存session id的方式可以采用cookie ,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標(biāo)識發(fā)送給服務(wù)器。
B .由于cookie 可以被人為的禁止,必須有其它的機制以便在cookie 被禁止時仍然能夠把session id傳遞回服務(wù)器,經(jīng)常采用的一種技術(shù)叫做URL 重寫,就是把session id附加在URL 路徑的后面,附加的方式也有兩種,一種是作為URL 路徑的附加信息,另一種是作為查詢字符串附加在URL 后面。網(wǎng)絡(luò)在整個交互過程中始終保持狀態(tài),就必須在每個客戶端可能請求的路徑后面都包含這個session id。
C .另一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務(wù)器。
二十五、session cookie和session 對象的生命周期是一樣的嗎
當(dāng)用戶關(guān)閉了瀏覽器雖然session cookie已經(jīng)消失,但session 對象仍然保存在服務(wù)器端
二十六、是否只要關(guān)閉瀏覽器,session 就消失了
,程序一般都是在用戶做log off 的時候發(fā)個指令去刪除session ,然而瀏覽器從來不會主動在關(guān)閉之前通知服務(wù)器它將要被關(guān)閉,因此服務(wù)器根本不會有機會知道瀏覽器已經(jīng)關(guān)閉。服務(wù)器會一直保留這個會話對象直到它處于非活動狀態(tài)超過設(shè)定的間隔為止。
之所以會有這種錯誤的認識,是因為大部分session 機制都使用會話cookie 來保存session id ,而關(guān)閉瀏覽器后這個session id就消失了,再次連接到服務(wù)器時也就無法找到原來的session 。
如果服務(wù)器設(shè)置的cookie 被保存到硬盤上,或者使用某種手段改寫瀏覽器發(fā)出的HTTP 請求報頭,把原來的session id 發(fā)送到服務(wù)器,則再次打開瀏覽器仍然能夠找到原來的session 。 恰恰是由于關(guān)閉瀏覽器不會導(dǎo)致session 被刪除,迫使服務(wù)器為session 設(shè)置了一個失效時間,當(dāng)距離客戶上一次使用session 的時間超過了這個失效時間時,服務(wù)器就可以認為客戶端已經(jīng)停止了活動,才會把session 刪除以節(jié)省存儲空間。
由此我們可以得出如下結(jié)論:
關(guān)閉瀏覽器,只會是瀏覽器端內(nèi)存里的session cookie消失,但不會使保存在服務(wù)器端的session 對象消失,同樣也不會使已經(jīng)保存到硬盤上的持久化cookie 消失。
二十七、打開兩個瀏覽器窗口訪問應(yīng)用程序會使用同一個session 還是不同的session
通常session cookie是不能跨窗口使用的,當(dāng)你新開了一個瀏覽器窗口進入相同頁面時,系統(tǒng)會賦予你一個新的session id,這樣我們信息共享的目的就達不到了。
此時我們可以先把session id 保存在persistent cookie 中(通過設(shè)置session 的最大有效時間) ,然后在新窗口中讀出來,就可以得到上一個窗口的session id 了,這樣通過session cookie 和persistent cookie的結(jié)合我們就可以實現(xiàn)了跨窗口的會話跟蹤。
2.cookies 的屬性有:Domain(域) :哪個站點發(fā)的哪個站點拿走
Expires:是否過期
Haskeys:是否包含關(guān)鍵
path:存放的路徑
secure:是否安全
注:---cookies 的設(shè)置在 sever端設(shè)置,路徑與域一起構(gòu)成cookie 的作用范圍
? 這個是什么意思的?。繛槭裁磿窃诜?wù)器端進行設(shè)置的呢?
---若不設(shè)置過期時間,則表示這個cookie 的生命期為瀏覽器會話期間,關(guān)閉瀏覽器窗口,cookie 就消失。這種生命期為瀏覽器會話期的cookie 被稱為會話cookie 。會話cookie 一般不存儲在硬盤上而是保存在內(nèi)存里,當(dāng)然這種行為并不是規(guī)范規(guī)定的。若設(shè)置了過期時間,瀏覽器就會把cookie 保存到硬盤上,關(guān)閉后再次打開瀏覽器,這些cookie 仍然有效