⑴ 怎麼查看session過期時間
如果單是判斷session失效的話那還是比較簡單的。 內置對象session中有一個方法session.getId(),每次登錄一個網站的時候會自動生成一個sessionId 只要判斷這個sessionID是不是null就好了。
⑵ 關於session在伺服器中有效期的問題
就算你關閉瀏覽器,session就是常說的會話,但是伺服器的會話依然存在,瀏覽器的會話,由於關閉了瀏覽器,瀏覽器會清空會話,也就是說,伺服器有會話,而瀏覽器沒有,等到了時間伺服器,就自動釋放了
⑶ app和伺服器交互 session有效期可以用嗎
詳細描述:cookie和session。在正常的瀏覽器中cookie保存在客戶端,session保存在服務端,當我們打開瀏覽器時,對伺服器進行操作時,這個時候伺服器會創建一個session,session是在一定時間內有效的。多個頁面也是共享的。這個時候我們把一些值放session中,然後客戶端可以取出該客戶端所對應的是session的裡面存放的值。也就是客戶端要跟服務端保持sessionid一致性才能取出相應的session。
⑷ 機器Session總是過期 怎麼解決
希望以下方法能幫到你:
問題存在的可能性:
第一,如果客戶端不允許cookie操作,session將失效。因為session是依賴於cookie的。
第二,session有失效時間的設定。預設的設置是20分鍾。你可以這樣修改它:Web directory -> Properties -> Virtual directory -> Application settings -> Configuration -> App Options -> Session timeout
或者在ASP中,寫上這樣的代碼:Session.timeout=60 。
第三,session是和具體的Web Application相關的。如果用戶從/procts/default.asp瀏覽到/jobs/default.asp,也可能造成session的重新創建。
怎麼清除一個不再需要的session變數但不使session失效?
在ASP3.0中:
Session.Contents.Remove "變數名"
可以清除一個變數。
在ASP2.0中:
set session("變數名")=NULL
可以清除變數。
在ASP3.0中,
Session.Contents.RemoveAll
可以清除所有的session變數和session.abandon不同,上面的方法都不會使目前的session過期或者無效。
⑸ session過期怎麼恢復
如何防止session超時
眾所周知,當用戶登錄網站後較長一段時間沒有與伺服器進行交互,將會導致伺服器上的用戶會話數據(即session)被銷毀。此時,當用戶再次操作網頁時,如果伺服器進行了session校驗,那麼瀏覽器將會提醒用戶session超時。
那麼,如何解決用戶登錄後較長時間未操作而導致的session失效的問題呢?[3]
導致這個問題的關鍵詞有兩個:一個是「長時間」,一個是「未操作」。
1、如果用戶未操作的「長時間」超過了伺服器配置的session超時時間,並導致session失效,那麼我們延長session的超時時間,讓用戶原來的「長時間」與超時時間相比,變得不「長」,不就可以解決了嗎?
2、如果用戶是長時間「未操作」導致session失效,那麼我們想辦法產生「操作」,讓用戶每隔一小段時間就「操作」一次,與伺服器產生交互,那麼session自然也不會失效。一般情況下下,我們首先想到的是,通過改變伺服器的配置,延長伺服器的session超時時間。例如,在Tomcat伺服器的web.xml文件中有如下節點內容:
<session-config><session-timeout>30</session-timeout></session-config>
這里的30表示session的超時時間,單位為分鍾,如果用戶登錄後在30分鍾內沒有與伺服器交互,那麼當前用戶的session將失效。我們可以配置一個更大的數值(比如60),就可以延長session的超時時間,如果將該值改為0或負數的話,則表示session永不失效。
不過在實際的工作應用中,一味地上調session的超時時間設置並不怎麼常見,大多數需要實現該功能的網站都將解決問題的焦點集中在第二條思路上。例如:一些在線網站均採用定時刷新頁面的方法來防止session超時。
定時刷新頁面,最常見的有兩種實現方式:一種是通過JavaScript+HTMLDOM,另一種則是通過meta標簽來實現。
1、JavaScript+HTMLDOM,示例代碼如下:
1
2
3
4
functionrefresh(seconds){
setTimeout("self.location.reload()",seconds*1000);
}
refresh(600);//調用方法啟動定時刷新,數值單位:秒。
2、通過meta標簽來實現(在頁面中添加meta標簽refresh也可以指定每隔指定時間就刷新當前頁面),示例代碼如下:
1
<metahttp-equiv="refresh"content="600"/>
上述meta標簽可以實現每過600秒就刷新一次當前頁面。
在上述兩種方案中,較好的為第二種,因為如果當前頁面是在IE瀏覽器的模式窗口中打開的,默認情況下,self.location.reload()方法將會失效,而refreshmeta標簽在IE模式窗口下仍然有效。
上述兩種方式都實現了刷新當前頁面,並且使用起來非常簡單,不過很遺憾的是,它們存在一種幾乎致命的缺陷。試想一下,如果在論壇發帖等需要用戶輸入內容的頁面,用戶花費較長的時間輸入了許多文本內容,可是突然遇到了一個定時頁面刷新,結果用戶輸入的所有內容都沒了,估計這個時候用戶連掐死你的心都有了……
因此我們需要在當前頁面本身不刷新、不影響用戶的任何操作的情況下實現定時刷新。最常見的解決方法仍然有兩種。一種是在當前頁面添加一個隱藏的iframe,然後在該iframe裡面實現定時刷新。
1
<iframeid="hidden_iframe"style="display:none;"scrolling="no"frameborder="0"name="hidden_iframe"src="ping.php"></iframe>
此外,我們需要在伺服器上編寫對應的請求響應代碼,例如ping.php中可以編寫如下代碼:
1
2
3
4
<?php
//每隔600秒刷新當前頁面
echo'<html><head><metahttp-equiv="refresh"content="600"/></head><body></body></html>';
?>
另外一種則是使用JavaScriptImage對象來實現定時刷新,JavaScript代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
functionautoRefresh(seconds){
if(typeofperiod=="undefined"){//如果是第一次執行
period=seconds*1000;//定義全局變數period
varbodyDOM=document.getElementsByTagName("body")[0];
if(bodyDOM){
bodyDOM.innerHTML+='<imgid="auto_refresh_img"src=""style="display:none"/>';//添加隱藏的圖片
imgDOM=document.getElementById("auto_refresh_img");//定義全局Image對象
}
}
if(typeofimgDOM!="undefined"){
imgDOM.src="ping.php?sid="+newDate().getTime();//防止緩存
setTimeout("autoRefresh("+seconds+")",period);
}
}
autoRefresh(600);//調用方法啟動定時刷新
和使用iframe來實現定時刷新一樣,使用JavaScriptImage對象實現定時刷新,也需要在伺服器端編寫類似的請求響應代碼。伺服器的響應可以是文字等非圖片內容,非圖片內容只會造成圖像載入失敗,而我們的圖像標簽本身就是隱藏的,不管是載入成功還是失敗都不會顯示,畢竟我們的主要目的是發送請求給伺服器,讓伺服器保持session處於活動狀態。
當然,還可以使用Ajax來實現定時刷新,不過使用Image對象會更好一些,因為有些老式瀏覽器的JavaScript無法實現Ajax,但是卻可以使用Image對象。此外,使用Ajax需要編寫更多的代碼來處理XMLHttpRequest等對象的活動。
在上述兩種方式中,各有其優缺點。
使用iframe標簽實現定時刷新的優點是:不需要編寫JavaScript代碼,可以在瀏覽器禁用JavaScript的情況下實現定時刷新;其缺點是:在某些不支持iframe標簽的老式瀏覽器中沒有效果,此外,iframe標簽在瀏覽器中新增加了一個獨立的頁面,即使沒有顯示出來,不過其內部解析的window、document等對象仍然存在,佔用的瀏覽器內存相對較多。
使用Image對象的優點是:與iframe相比,佔用的內存相對較少,支持Image的瀏覽器也相對較多(現代瀏覽器均支持);缺點是:在瀏覽器禁用JavaScript的情況下就毫無用武之地了。
開發人員應根據實際需求情況來確定使用何種實現方式更好。此外,伺服器在響應定時刷新的請求時,在滿足要求的情況下,應返回盡可能少的數據,以節省帶寬。
有效期
編輯
PHP中的session有效期默認是1440秒(24分鍾)【weiweiok 註:php5里默認的是180分】,也就是說,客戶端超過24分鍾沒有刷新,當前session就會失效。很明顯,這是不能滿足需要的。
一個已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存儲到數 據庫,這樣可以通過SQL語句來刪除所有過期的session,精確地控制session的有效期。這也是基於PHP的大型網站常用的方法。但是,一般的 小型網站,似乎沒有必要這么勞師動眾。
但是一般的Session的生命期有限,如果用戶關閉了瀏覽器,就不能保存Session的變數了!那麼怎麼樣可以實現Session的永久生命期呢?
大 家知道,Session儲存在伺服器端,根據客戶端提供的SessionID來得到這個用戶的文件,然後讀取文件,取得變數的值,SessionID可以 使用客戶端的Cookie或者Http1.1協議的Query_String(就是訪問的URL的「?」後面的部分)來傳送給伺服器,然後伺服器讀取 Session的目錄……
要實現Session的永久生命期,首先需要了解一下php.ini關於Session的相關設置(打開php.ini文件,在「[Session]」部分):
1、session.use_cookies:默認的值是「1」,代表SessionID使用Cookie來傳遞,反之就是使用Query_String來傳遞;
2、session. name:這個就是SessionID儲存的變數名稱,可能是Cookie,也可能是Query_String來傳遞,默認值是「PHPSESSID」;
3、session.cookie_lifetime:這個代表SessionID在客戶端Cookie儲存的時間,默認是0,代表瀏覽器一關閉SessionID就作廢……就是因為這個所以Session不能永久使用!
4、session.gc_maxlifetime:這個是Session數據在伺服器端儲存的時間,如果超過這個時間,那麼Session數據就自動刪除!
功能缺陷
編輯
目前ASP的開發人員都正在使用Session這一強大的功能,但是在他們使用的過程中卻發現了ASP Session有以下缺陷:
進程依賴性
ASP Session狀態存於IIS的進程中,也就是inetinfo.exe這個程序。所以當inetinfo.exe進程崩潰時,這些信息也就丟失。另外,重起或者關閉IIS服務都會造成信息的丟失。
Session狀態使用范圍的局限性
當一個用戶從一個網站訪問到另外一個網站時,這些Session信息並不會隨之遷移過去。例如:新浪網站的WWW伺服器可能不止一個,一個用戶登錄之後要去各個頻道瀏覽,但是每個頻道都在不同的伺服器上,如果想在這些WWW伺服器共享Session信息怎麼辦呢
Cookie的依賴性
實際上客戶端的Session信息是存儲在Cookie中的,如果客戶端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
鑒於ASP Session的以上缺陷,微軟的設計者們在設計開發 ASP .NET Session時進行了相應的改進,完全克服了以上缺陷,使得ASP .NET Session成為了一個更加強大的功能。
Hibernate
編輯
Session是JAVA應用程序和Hibernate進行交互時使用的主要介面,它也是持久化操作核心API,
注意這里的Session的含義,它與傳統意思上web層的HttpSession並沒有關系,Hibernate Session之與Hibernate,相當於JDBC Connection相對與JDBC。
Session對象是有生命周期的,它以Transaction對象的事務開始和結束邊界
Session作為貫穿Hibernate的持久化管理器核心,提供了眾多的持久化的方法,如save(),update,delete,find(Hibernate 3中已經取消了此方法,)等,通過這些方法我們可以透明的完成對象的增刪改查(CRUD-- create read update delete),這里所謂的透明是指,Session在讀取,創建和刪除映射的實體對象的實例時,這一系列的操作將被轉換為對資料庫表中數據的增加,修改,查詢和刪除操作。
Session有以下的特點:
1,不是線程安全的,應該避免多個線程共享同一個Session實例
2,Session實例是輕量級的,所謂輕量級:是指他的創建和刪除不需要消耗太多資源
3,Session對象內部有一個緩存,被稱為Hibernate第一緩存,他存放被當前工作單元中載入的對象,每個Session實例都有自己的緩存。
org.hibernate Interface Session
public interface Session extends Serializable : 是一個Java application 和Hibernate之間主要的運行時介面,這是執行持久化服務的中心API
主要方法:
public Transaction beginTransaction() throws HibernateException:返回和當前Session對象相互聯系的Transaction對象(表示在資料庫中重新開始一個事務)
public Transaction getTransaction():返回和當前session聯系的Transaction對象
public Connection connection close() throws HibernateExcepton:結束當前的Session對象
public void clear() :清空Session,清除所有保存在當前Session緩存中的實體對象,終止所有正在執行的方法(eg: save(),update(),delete() .....)
public Serializable save(Object object)throws HibernateException 對當前參數指定的對象進行持久化(系統會首先賦予參數對象一個標識符OID),他相當於insert語句 後面在詳細介紹
public Connection connection() throws HibernateException 得到當前Session 中包含的Connection對象。
public boolean contains(Object object):判斷參數給出的對象(持久化類)是否在當前Session的緩存中
public void evict(Object object) throws HibernateException :將參數給出的Object從當前Session對象類中刪除,使這個對象從持久態變成游離態,這種狀態的改變不會引起對資料庫的同步,後面詳細介紹
public Object load(Class theclass,Serializable id) throws HibernateException 返回第一個參數指定類對應的表中,第二個參數指定的行(第二個參數就是要取得對象的OID,他對應表中主鍵列的值)
public void update(Object object) throws HibernateException :更新一個對象到資料庫中,後面在詳細介紹
public void delete (Object object)throws HibernateException:從資料庫中刪除和參數指定的對象對應的記錄
public Object get(Class class,Serializable id) throws HibernateException:和load()方法一樣區別在於,如果資料庫表中沒有對應的記錄,get()方法返回null,load()方法將報異常
⑹ 如何設置Session的有效期
1.設置客戶端cookie的lifetime為30分鍾;
2.設置session的最大存活周期也為30分鍾;
3.為每個session值加入時間戳,然後在程序調用時進行判斷;
至於為什麼,我們首先來了解下php中session的基本原理:
PHP中的session有效期默認是1440秒(24分鍾),也就是說,客戶端超過24分鍾沒有刷新,當前session就會失效。當然如果用戶關閉了瀏覽器,會話也就結束了,Session自然也不存在了!
大家知道,Session儲存在伺服器端,根據客戶端提供的SessionID來得到這個用戶的文件,然後讀取文件,取得變數的值,SessionID可以使用客戶端的Cookie或者Http1.1協議的
Query_String(就是訪問的URL的「?」後面的部分)來傳送給伺服器,然後伺服器讀取Session的目錄……
要控制Session的生命周期,首先我們需要了解一下php.ini關於Session的相關設置(打開php.ini文件,在「[Session]」部分):
1、session.use_cookies:默認的值是「1」,代表SessionID使用Cookie來傳遞,反之就是使用Query_String來傳遞;
2、session.name:這個就是SessionID儲存的變數名稱,可能是Cookie,也可能是Query_String來傳遞,默認值是「PHPSESSID」;
3、session.cookie_lifetime:這個代表SessionID在客戶端Cookie儲存的時間,默認是0,代表瀏覽器一關閉SessionID就作廢……就是因為這個所以Session不能永久使用!
4、session.gc_maxlifetime:這個是Session數據在伺服器端儲存的時間,如果超過這個時間,那麼Session數據就自動刪除!
還有很多的設置,不過和本文相關的就是這些了,下面開始講如何設置Session的存活周期。
前面說過,伺服器通過SessionID來讀取Session的數據,但是一般瀏覽器傳送的SessionID在瀏覽器關閉後就沒有了,那麼我們只需要人為的設置SessionID並且保存下來,不就可以……
如果你擁有伺服器的操作許可權,那麼設置這個非常非常的簡單,只是需要進行如下的步驟:
1、把「session.use_cookies」設置為1,使用Cookie來儲存SessionID,不過默認就是1,一般不用修改;
2、把「session.cookie_lifetime」改為你需要設置的時間(比如一個小時,就可以設置為3600,以秒為單位);
3、把「session.gc_maxlifetime」設置為和「session.cookie_lifetime」一樣的時間;
在PHP的文檔中明確指出,設定session有效期的參數是session.gc_maxlifetime。可以在php.ini文件中,或者通過ini_set()函數來修改這一參數。問題在於,經過多次測試,修改這個
參數基本不起作用,session有效期仍然保持24分鍾的默認值。
由於PHP的工作機制,它並沒有一個daemon線程,來定時地掃描session信息並判斷其是否失效。當一個有效請求發生時,PHP會根據全局變數
session.gc_probability/session.gc_divisor(同樣可以通過php.ini或者ini_set()函數來修改)的值,來決定是否啟動一個GC(Garbage Collector)。
默認情況下,session.gc_probability = 1,session.gc_divisor =100,也就是說有1%的可能性會啟動GC。GC的工作,就是掃描所有的session信息,用當前時間減去session的最後修
改時間(modified date),同session.gc_maxlifetime參數進行比較,如果生存時間已經超過gc_maxlifetime,就把該session刪除。
到此為止,工作一切正常。那為什麼會發生gc_maxlifetime無效的情況呢?
在默認情況下,session信息會以文本文件的形式,被保存在系統的臨時文件目錄中。在Linux下,這一路徑通常為\tmp,在 Windows下通常為C:\Windows\Temp。當伺服器上有多個PHP應
用時,它們會把自己的session文件都保存在同一個目錄中。同樣地,這些PHP應用也會按一定機率啟動GC,掃描所有的session文件。
問題在於,GC在工作時,並不會區分不同站點的session。舉例言之,站點A的gc_maxlifetime設置為2小時,站點B的 gc_maxlifetime設置為默認的24分鍾。當站點B的GC啟動時,它會掃
描公用的臨時文件目錄,把所有超過24分鍾的session文件全部刪除掉,而不管它們來自於站點A或B。這樣,站點A的gc_maxlifetime設置就形同虛設了。
找到問題所在,解決起來就很簡單了。修改session.save_path參數,或者使用session_save_path()函數,把保存session的目錄指向一個專用的目錄,gc_maxlifetime參數工作正常了。
還有一個問題就是,gc_maxlifetime只能保證session生存的最短時間,並不能夠保存在超過這一時間之後session信息立即會得到刪除。因為GC是按機率啟動的,可能在某一個長時間內
都沒有被啟動,那麼大量的session在超過gc_maxlifetime以後仍然會有效。
解決這個問題的一個方法是,把session.gc_probability/session.gc_divisor的機率提高,如果提到100%,就會徹底解決這個問題,但顯然會對性能造成嚴重的影響。另一個方法是自己
在代碼中判斷當前session的生存時間,如果超出了 gc_maxlifetime,就清空當前session。
⑺ session 失效 時間
WebWebsphereXML配置管理Servlet
session-timeout(web.xml)元素與session.setMaxInactiveInterval()函數
a) web app server中,如websphere里可以設置超時時間為30分鍾
b)在web.xml中的session-config配置
session-timeout元素(WEB.XML文件中的元素)用來指定默認的會話超時時間間隔,以分鍾為單位。該元素值必須為整數。如果 session-timeout元素的值為零或負數,則表示會話將永遠不會超時。如:
1. <session-config>
2. <session-timeout>30</session-timeout>
3. </session-config>
4. //30分鍾
setMaxInactiveInterval設置的是當前會話的失效時間,不是整個web的時間,單位為以秒計算。如果設置的值為零或負數,則表示會話將永遠不會超時。常用於設置當前會話時間。
c) 在程序中手動設置
java 代碼
1. session.setMaxInactiveInterval(30 * 60);
想問兩個問題:
一、它們的優先順序?我想C應該最優先,但a和b 呢
二、如果一個應用的多個地方設置了不同的interval,會對session有影響嗎?
如後台管理用戶登錄設置超時時間為30分鍾,前台用戶登錄設置超時時間為15分鍾。
此時的setMaxInactiveInterval是隻影響servlet容器session的實例?還是影響整個容器(如果是這個,就有問題了)
不對,是可以設置的,三種方式設置:
1. 在server.xml中定義context時採用如下定義:
<Context path="/livsorder" docBase="/home/httpd/html/livsorder"
defaultSessionTimeOut="3600" isWARExpanded="true"
isWARValidated="false" isInvokerEnabled="true"
isWorkDirPersistent="false"/>
2. 在web.xml中通過參數指定:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
其中30表示30分鍾
3. 在程序中通過servlet api直接修改
HttpSession ses = request.getSession();
ses.setMaxInactiveInterval(10);
設置單位為秒,設置為-1永不過期。
因為可能要用到cookie,所以學了一下,但又發現不用了,為了以後不忘,寫下此篇筆記。
一、cookie簡介 瀏覽器與WEB伺服器之間是使用HTTP協議進行通信的;而HTTP協議是無狀態協議。也就是說,當某個用戶發出頁面請求時,WEB伺服器只是簡單的進行響應,然後就關閉與該用戶的連接。因此當一個請求發送到WEB伺服器時,無論其是否是第一次來訪,伺服器都會把它當作第一次來對待,這樣的不好之處可想而知。為了彌補這個缺陷,Netscape開發出了cookie這個有效的工具來保存某個用戶的識別信息, 它是一種WEB伺服器通過瀏覽器在訪問者的硬碟上存儲信息的手段。 它是伺服器發送給瀏覽器的體積很小的純文本信息。 定義:cookie是Web瀏覽器存儲的少量命名數據,它與某個特定的網頁和網站關聯在一起。 cookie實際上和某一網站和網頁關聯的,保存用戶一定信息的文本文件。
二、cookie的屬性 除名字與值外,每個cookie有四個可選屬性: 1.expires:指定cookie的生存期。默認情況下cookie是暫時的,瀏覽器關閉就失效。 2.path:它指定了與cookie關聯在一起的網頁。默認是在和當前網頁同一目錄的網頁中有效。 如果把path設置為"/",那麼它對該網站的所有網頁都可見了。 3.domain:設定cookie有效的域名, 如果把path設置為"/",把domain設為".sohu.com",那麼 A.sohu.com和B.sohu.com 的所有網頁都能夠訪問此cookie。 4.secure:布爾值,它指定了網路上如何傳輸cookie。默認情況下,cookie是不安全的, 可以通過一個不安全的,普通的HTTP協議傳輸;若設置cookie為安全的,那麼它將 只在瀏覽器和伺服器通過HTTPS或其它的安全協議連接在一起時才被傳輸。
三、cookie的操作 cookie可以用javascipt來操作,也可以用JSP來操作。 下面給大家我寫的幾個例子,相信大家一看就明白了: 1.javascript 操作:
<script language="javascript">
//設置cookie,cookie有效期時間未GMT時間(距1970年1月1日臨時的毫秒)
//例如可以設置setCookie("password","12345",(3600000*24*180)),180有效
function setCookie (name, value, expires) {
var expdate = new Date();
expdate.setTime(expdate.getTime() + expires);
document.cookie = name + "=" + escape(value) +
"; expires=" + expires.toGMTString() + "; path=/";
}
//根據cookie名,取得cookie值
function getCookie(name) {
var search;
search = name + "="
offset = document.cookie.indexOf(search)
if (offset != -1) {
offset += search.length ;
end = document.cookie.indexOf(";", offset) ;
if (end == -1)
end = document.cookie.length;
return unescape(document.cookie.substring(offset, end));
}
else
return "";
}
//刪除某一cookie
function deleteCookie(name) {
var expdate = new Date();
expdate.setTime(expdate.getTime() - (3600 *24* 1000 * 1));
setCookie(name, "", expdate);
}
//檢查是否存在此cookie
function checkCookie(cookieName,cookieValue){
if (getCookie(cookieName)==cookieValue){
return true;
}else{
return false;
}
}
</script>
2.jsp 操作: java中有個Cookie類:javax.servlet.http.Cookie
//讀取cookie的通用類,以Cookie[] 做參數傳個構造函數;
package com.test;
import javax.servlet.http.*;
/**
* @author sheng_li
*
*/
public class ComCookie {
private Cookie[] cookies;
private Cookie cookie;
public ComCookie(Cookie[] cs){
cookies = cs;
}
/**
* 通過cookieName,取得cookieValue,如果沒有此cookie則返回默認值
* @param cookieName
* @param defaultValue
* @return
*/
public String getCookieValue(String cookieName,String defaultValue) {
for(int i=0; i< cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName()))
return(cookie.getValue());
}
return(defaultValue);
}
/**
* 類方法,通過cookieName,取得cookieValue
* @param cookies
* @param cookieName
* @param defaultValue
* @return
*/
public static String getCookieValue(Cookie[] cookies,
String cookieName,
String defaultValue) {
for(int i=0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName()))
return(cookie.getValue());
}
return(defaultValue);
}
}
JSP中:(以下內容來源於網路)
JSP是使用如下的語法格式來創建cookie的: Cookie cookie_name =new Cookie("Parameter","Value"); 例如:Cookie newCookie =new Cookie("username","waynezheng"); response.addCookie(newCookie); 解釋:JSP是調用Cookie對象相應的構造函數Cookie(name,value)用合適的名字和值來創建Cookie,然後 Cookie可以通過HttpServletResponse的addCookie方法加入到Set-Cookie應答頭,本例中Cookie對象有兩個字元串參數:username,waynezheng。注意,名字和值都不能包含空白字元以及下列字元: @ : ;? , " / [ ] ( ) =
處理Cookie的屬性 看到這里,有的朋友又要問了:我光知道如何創建Cookie有什麼用呀?是呀,光知道如何創建Cookie而不知道怎麼使用是不夠的。在JSP中,程序是通過cookie.setXXX設置各種屬性,用cookie.getXXX讀出cookie的屬性,現把Cookie的主要屬性,及其方法列於下,供大家參考: 讀取客戶端的Cookie
類型 方法名 方法解釋
String getComment() 返回cookie中注釋,如果沒有注釋的話將返回空值.
String getDomain() 返回cookie中Cookie適用的域名. 使用getDomain() 方法可以指示瀏覽器把Cookie返回給同 一域內的其他伺服器,而通常Cookie只返回給與發送它的伺服器名字完全相同的伺服器。注意域名必須以點開始(例如.yesky.com)
int getMaxAge() 返回Cookie過期之前的最大時間,以秒計算。
String getName() 返回Cookie的名字。名字和值是我們始終關心的兩個部分,筆者會在後面詳細介紹 getName/setName。
String getPath() 返回Cookie適用的路徑。如果不指定路徑,Cookie將返回給當前頁面所在目錄及其子目錄下 的所有頁面。
boolean getSecure() 如果瀏覽器通過安全協議發送cookies將返回true值,如果瀏覽器使用標准協議則返回false值。
String getValue() 返回Cookie的值。筆者也將在後面詳細介紹getValue/setValue。
int getVersion() 返回Cookie所遵從的協議版本。
void setComment(String purpose) 設置cookie中注釋。
void setDomain(String pattern) 設置cookie中Cookie適用的域名
void setMaxAge(int expiry) 以秒計算,設置Cookie過期時間。
void setPath(String uri) 指定Cookie適用的路徑。
void setSecure(boolean flag) 指出瀏覽器使用的安全協議,例如HTTPS或SSL。
void setValue(String newValue) cookie創建後設置一個新的值。
void setVersion(int v) 設置Cookie所遵從的協議版本。
在Cookie發送到客戶端前,先要創建一個Cookie,然後用addCookie方法發送一個HTTP Header。 JSP將調用request.getCookies()從客戶端讀入Cookie,getCookies()方法返回一個HTTP請求頭中 的內容對應的Cookie對象數組。你只需要用循環訪問該數組的各個元素,調用getName方法檢查各 個Cookie的名字,至找到目標Cookie,然後對該Cookie調用getValue方法取得與指定名字關聯的值 。
例如
<%
String userName=request.getParameter("username");//從提交的HTML表單中獲取,用戶名
Cookie theUsername=new Cookie("username",userName);//以"username",userName值/對創建一個Cookie
response.addCookie(theUsername);
%>
..............
<%
Cookie myCookie[]=request.getCookies();//創建一個Cookie對象數組
for(int n=0;n=cookie.length-1;i++);//設立一個循環,來訪問Cookie對象數組的每一個元素
Cookie newCookie= myCookie[n];
if(newCookie.getName().equals("username")); //判斷元素的值是否為username中的值
{%>
你好,<%=newCookie.getValue()%>!//如果找到後,向他問好
<%}
%>
設置Cookie的存在時間,及刪除Cookie 在JSP中,使用setMaxAge(int expiry)方法來設置Cookie的存在時間,
參數expiry應是一個整數。正值表示cookie將在這么多秒以後失效。 注意這個值是cookie將要存在的最大時間,
而不是cookie現在的存在時間。 負值表示當瀏覽器關閉時,Cookie將會被刪除。零值則是要刪除該Cookie。 如:
<%
Cookie deleteNewCookie=new Cookie("newcookie",null);
deleteNewCookie.setMaxAge(0);
deleteNewCookie.setPath("/");
response.addCookie(deleteNewCookie);
%>
tomcat設置session失效時間
分類: Java 2011-11-09 18:50 107人閱讀 評論(0) 收藏 舉報
tomcat在5.5以後,就沒有自帶admin項目了,如果要從http://localhost:8080界面進入tomcat管理頁面,需要從網上下載對應的tomcat-admin.zip,舉個例子,如果你的tomcat是5.5.30的,需要從http://tomcat.apache.org/download-55.cgi下載(在下載頁面的Binary Distributions欄下的第四大項,Administration Web Application 即是)。解壓以後,得到的文件夾里,東西都已經給你整理好了。
你只需要按照解壓文件的目錄,這些文件到$CATALINA_BASE對應的目錄下,項目映射文件admin.xml中的路徑稍微改下,然後重啟tomcat就行了。
在tomcat的conf目錄下的tomcat-user.xml文件中還需要加
<role rolename="standard"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="admin" password="admin" roles="standard,manager,admin"/>
來添加一個admin用戶,這樣就可以訪問tomcat的admin頁面了。
同樣,我們可以訪問tomcat的manager頁面來查看session的信息,在tomcat6.0以上的版本是自帶了manager這個項目的,如果是tomcat5.5.x的版本也需要去網上下載的,配置同admin。
這里說說session過期時間的設置,一般來說方法有四種:
1. 在tomcat——>conf——>servler.xml文件中定義:
<Context path="/test" docBase="/test"
defaultSessionTimeOut="3600" isWARExpanded="true"
isWARValidated="false" isInvokerEnabled="true"
isWorkDirPersistent="false"/> //單位是秒
2. 在web.xml中定義:這個針對具體項目
<session-config>
<session-timeout>20</session-timeout>//單位是分鍾,0表示session不會失效
</session-config>
3. 在程序中定義:這個就針對具體頁面了
session.setMaxInactiveInterval(30*60);//單位是秒
4.在conf/context.xml文件設置:這個是針對所有的項目了
打開context.xml,在<Context>節點下添加如下<Manager>節點:
<Manager className="org.apache.catalina.session.PersistentM anager" >
debug=0
saveOnRestart="true"
maxActiveSession="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1"
<Store className="org.apache.catalina.session.FileStore" directory="../session" />
//這里代表的是文件持久化.也可以自己實現Store
</Manager>
saveOnRestart:(true/false)配置服務重啟工程中對session的處理,若為true,則關閉前把有效的session保存,啟動後重新載入 maxActiveSession:活動狀態Session的最大數,為-1時則不限制,否則Session Manager將會把超出的Session對象轉移到Session Store中。
minIdleSwap:Session不活動的最短時間,超過該時間,Session Manager 可能會把該Session對象轉移到Session Store中,單位為秒。
maxidleSwap:Session不活動的最長時間,超過該時間,Session Manager 將會把該Session對象轉移到Session Store中,該Session將不在內存中。
maxidleBackup: Session不活動的最長時間,超過該時間,Session Manager 將會把該Session對象備份到Session Store中,但該Session對象依然存在內存中。
<Store>指定實現持久化的類和Session存放的文件位置,如該例子中指定的類是:org.apache.catalina.session.FileStore,而Session對象存放的目錄則是tomcat根目錄下的 session文件夾(當然自己創建)
在第四種配置中,配置完後可以寫一個簡單的jsp頁面,在頁面上顯示本次用戶訪問的Session ID,然後重起tomcat,再刷新該頁面,可以看到該Session Id不變,而在/session目錄下自動生成一個以session id為名,以「session」為擴展名的文件。該Session的持久化配置成功。
⑻ 如何保持session持久化
默認的cookie變數的有效期是 瀏覽器關閉。就導致 session的id是保存在cookie內的,一旦關閉瀏覽器 cookie失效,同時 cookie內的session_id失效,導致 session失效。所以我們只要將保持session_id的cookie的時間設置較長即可。
⑼ 如何配置伺服器session過期時間
在一般系統登錄後,都會設置一個當前session失效的時間,以確保在用戶沒有使用系統一定時間後,自動退出登錄,銷毀session。具體設置很簡單:在主頁面或者公共頁面中加入:session.setMaxInactiveInterval(900);參數900單位是秒,即在沒有活動15分鍾後,session將失效。這里要注意這個session設置的時間是根據伺服器來計算的,而不是客戶端。所以如果是在調試程序,應該是修改伺服器端時間來測試,而不是客戶端。在一般系統中,也可能需要在session失效後做一些操作,(1)控制用戶數,當session失效後,系統的用戶數減少一個等,控制用戶數在一定范圍內,確保系統的性能。(2)控制一個用戶多次登錄,當session有效時,如果相同用戶登錄,就提示已經登錄了,當session失效後,就可以不用提示,直接登錄了那麼如何在session失效後,進行一系列的操作呢?這里就需要用到監聽器了,即當session因為各種原因失效後,監聽器就可以監聽到,然後執行監聽器中定義好的程序,就可以了。監聽器類為:HttpSessionListener類,有sessionCreated和sessionDestroyed兩個方法自己可以繼承這個類,然後分別實現。sessionCreated指在session創建時執行的方法sessionDestroyed指在session失效時執行的方法給一個簡單的例子:{publicvoidsessionCreated(HttpSessionEventevent){HttpSessionses=event.getSession();Stringid=ses.getId()+ses.getCreationTime();SummerConstant.UserMap.put(id,Boolean.TRUE);//添加用戶}publicvoidsessionDestroyed(HttpSessionEventevent){HttpSessionses=event.getSession();Stringid=ses.getId()+ses.getCreationTime();synchronized(this){SummerConstant.USERNUM--;//用戶數減一SummerConstant.UserMap.remove(id);//從用戶組中移除掉,用戶組為一個map}}}然後只需要把這個監聽器在web.xml中聲明就可以了例如:com.summer.kernel.tools.SessionListener補充:具體設置很簡單,方法有三種:(1)在主頁面或者公共頁面中加入:java代碼1.HttpSessionses=request.getSession();2.ses.setMaxInactiveInterval(10);session.setMaxInactiveInterval(900);參數900單位是秒,即在沒有活動15分鍾後,session將失效。這里要注意這個session設置的時間是根據伺服器來計算的,而不是客戶端。所以如果是在調試程序,應該是修改伺服器端時間來測試,而不是客戶端。(2)也是比較通用的設置session失效時間的方法,就是在項目的web.xml中設置15這里的15也就是15分鍾失效.(3)直接在應用伺服器中設置,如果是tomcat,可以在tomcat目錄下conf/web.xml中找到元素,tomcat默認設置是30分鍾,只要修改這個值就可以了。在server.xml中定義context中如下定義:xml代碼需要注意的是如果上述三個地方如果都設置了,有個優先順序的問題,從高到低:(3)à(2)---à(1)--相關文章:•Session過期時間的四種設置方式•PHP中,設定Session過期時間•設置Session過期時間的問題•設置用於Session的Cookie的過期•ASP中Session技巧默認過期時間•判斷Session的過期時間-採用Java
⑽ php怎麼設置session的有效時間
如何嚴格限制session在30分鍾後過期!
1.設置客戶端cookie的lifetime為30分鍾;
2.設置session的最大存活周期也為30分鍾;
3.為每個session值加入時間戳,然後在程序調用時進行判斷;
至於為什麼,我們首先來了解下php中session的基本原理:
PHP中的session有效期默認是1440秒(24分鍾),也就是說,客戶端超過24分鍾沒有刷新,當前session就會失效。當然如果用戶關閉了瀏覽器,會話也就結束了,Session自然也不存在了!
大家知道,Session儲存在伺服器端,根據客戶端提供的SessionID來得到這個用戶的文件,然後讀取文件,取得變數的值,SessionID可以使用客戶端的Cookie或者Http1.1協議的
Query_String(就是訪問的URL的「?」後面的部分)來傳送給伺服器,然後伺服器讀取Session的目錄……
要控制Session的生命周期,首先我們需要了解一下php.ini關於Session的相關設置(打開php.ini文件,在「[Session]」部分):
1、session.use_cookies:默認的值是「1」,代表SessionID使用Cookie來傳遞,反之就是使用Query_String來傳遞;
2、session.name:這個就是SessionID儲存的變數名稱,可能是Cookie,也可能是Query_String來傳遞,默認值是「PHPSESSID」;
3、session.cookie_lifetime:這個代表SessionID在客戶端Cookie儲存的時間,默認是0,代表瀏覽器一關閉SessionID就作廢……就是因為這個所以Session不能永久使用!
4、session.gc_maxlifetime:這個是Session數據在伺服器端儲存的時間,如果超過這個時間,那麼Session數據就自動刪除!
還有很多的設置,不過和本文相關的就是這些了,下面開始講如何設置Session的存活周期。
前面說過,伺服器通過SessionID來讀取Session的數據,但是一般瀏覽器傳送的SessionID在瀏覽器關閉後就沒有了,那麼我們只需要人為的設置SessionID並且保存下來,不就可以……
如果你擁有伺服器的操作許可權,那麼設置這個非常非常的簡單,只是需要進行如下的步驟:
1、把「session.use_cookies」設置為1,使用Cookie來儲存SessionID,不過默認就是1,一般不用修改;
2、把「session.cookie_lifetime」改為你需要設置的時間(比如一個小時,就可以設置為3600,以秒為單位);
3、把「session.gc_maxlifetime」設置為和「session.cookie_lifetime」一樣的時間;
在PHP的文檔中明確指出,設定session有效期的參數是session.gc_maxlifetime。可以在php.ini文件中,或者通過ini_set()函數來修改這一參數。問題在於,經過多次測試,修改這個
參數基本不起作用,session有效期仍然保持24分鍾的默認值。
由於PHP的工作機制,它並沒有一個daemon線程,來定時地掃描session信息並判斷其是否失效。當一個有效請求發生時,PHP會根據全局變數
session.gc_probability/session.gc_divisor(同樣可以通過php.ini或者ini_set()函數來修改)的值,來決定是否啟動一個GC(Garbage Collector)。
默認情況下,session.gc_probability = 1,session.gc_divisor =100,也就是說有1%的可能性會啟動GC。GC的工作,就是掃描所有的session信息,用當前時間減去session的最後修
改時間(modified date),同session.gc_maxlifetime參數進行比較,如果生存時間已經超過gc_maxlifetime,就把該session刪除。
到此為止,工作一切正常。那為什麼會發生gc_maxlifetime無效的情況呢?
在默認情況下,session信息會以文本文件的形式,被保存在系統的臨時文件目錄中。在Linux下,這一路徑通常為\tmp,在 Windows下通常為C:\Windows\Temp。當伺服器上有多個PHP應
用時,它們會把自己的session文件都保存在同一個目錄中。同樣地,這些PHP應用也會按一定機率啟動GC,掃描所有的session文件。
問題在於,GC在工作時,並不會區分不同站點的session。舉例言之,站點A的gc_maxlifetime設置為2小時,站點B的 gc_maxlifetime設置為默認的24分鍾。當站點B的GC啟動時,它會掃
描公用的臨時文件目錄,把所有超過24分鍾的session文件全部刪除掉,而不管它們來自於站點A或B。這樣,站點A的gc_maxlifetime設置就形同虛設了。
找到問題所在,解決起來就很簡單了。修改session.save_path參數,或者使用session_save_path()函數,把保存session的目錄指向一個專用的目錄,gc_maxlifetime參數工作正常了。
還有一個問題就是,gc_maxlifetime只能保證session生存的最短時間,並不能夠保存在超過這一時間之後session信息立即會得到刪除。因為GC是按機率啟動的,可能在某一個長時間內
都沒有被啟動,那麼大量的session在超過gc_maxlifetime以後仍然會有效。
解決這個問題的一個方法是,把session.gc_probability/session.gc_divisor的機率提高,如果提到100%,就會徹底解決這個問題,但顯然會對性能造成嚴重的影響。另一個方法是自己
在代碼中判斷當前session的生存時間,如果超出了 gc_maxlifetime,就清空當前session。