使用url重寫實現(xiàn)Session跟蹤 這是在瀏覽器不支持Cookie的情況下,,servlet引入的一種補(bǔ)充的會話機(jī)制。當(dāng)用戶發(fā)出下一次請求時,,如果請求消息中沒有包含Cookie頭字段,,Servlet引擎則認(rèn)為客戶端不支持Cookie,他將依據(jù)請求url參數(shù)中的會話標(biāo)識號來實施會話跟蹤。這種方式要求響應(yīng)消息中出現(xiàn)的超鏈接地址后面附帶會話標(biāo)識號參數(shù),用戶也必須通過超鏈接來提交后續(xù)的訪問請求,。 這種技術(shù)成為url重寫,,tomcat發(fā)送給客戶端的會話標(biāo)識號的Cookie名稱為JSESSIONID。url重寫就是將JSESSIONID關(guān)鍵字作為參數(shù)名和將會話標(biāo)識號作為參數(shù)附加到URL后面,。如果瀏覽器不支持Cookie或者關(guān)閉Cookie,,就必須對所有可能被客戶端訪問的請求路徑進(jìn)行 URL重寫,如超鏈接,,form表單的action屬性和重定向的URL
HttpServletResponse接口定義了兩個用于URL重寫的方法: encodeURL方法,,用于超鏈接和form表單的action屬性中設(shè)置的URL進(jìn)行重寫 encodeRedirectURL 方法 用于對傳遞給HttpServletResponse.sendRedirect方法的URL進(jìn)行重寫 他們根據(jù)請求消息中是否含有Cookie頭字段來決定是否進(jìn)行url重寫。把URL作為參數(shù)傳遞給這兩個方法,,他們就能完成url重寫,,在url后面添加 jsessionid參數(shù)及其值??梢躁P(guān)閉瀏覽器的Cookie,,然后,進(jìn)行實驗,,在網(wǎng)頁源文件中查看URL后面是否有jsessionid參數(shù)及其值,。
Session的持久化 客戶端訪問了某個能開啟會話功能的資源, web服務(wù)器就會創(chuàng)建一個與該客戶端對應(yīng)的HttpSession對象,,每個HttpSession對象都要站用一定的內(nèi)存空間,。如果在某一時間段內(nèi)訪問站點的用戶很多,web服務(wù)器內(nèi)存中就會積累大量的HttpSession對象,,消耗大量的服務(wù)器內(nèi)存,,即使用戶已經(jīng)離開或者關(guān)閉了瀏覽器,web服務(wù)器仍要保留與之對應(yīng)的HttpSession對象,,在他們超時之前,,一直占用web服務(wù)器內(nèi)存資源。 web服務(wù)器通常將那些暫時不活動但為超時的HttpSession對象轉(zhuǎn)移到文件系統(tǒng)或數(shù)據(jù)庫中保存,,服務(wù)器要使用他們時再將他們從文件系統(tǒng)或數(shù)據(jù)庫中裝載入內(nèi)存,,這種技術(shù)稱為Session的持久化。 將 HttpSession對象保存到文件系統(tǒng)或數(shù)據(jù)庫中,,需要采用序列化的方式將HttpSession對象中的每個屬性對象保存到文件系統(tǒng)或數(shù)據(jù)庫中,;將 HttpSession對象從文件系統(tǒng)或數(shù)據(jù)庫中裝載如內(nèi)存時,需要采用反序列化的方式,,恢復(fù)HttpSession對象中的每個屬性對象。所以存儲在 HttpSession對象中的每個屬性對象必須實現(xiàn)Serializable接口,。
Session的持久化的作用: 1.提高服務(wù)器內(nèi)存的利用率,,保證那些暫停活動的客戶端在會話超時之前繼續(xù)原來的會話 2,在多臺web服務(wù)器協(xié)同對外提供服務(wù)的集群系統(tǒng)中,,使用Session的持久化技術(shù),,某臺服務(wù)器可以將其中發(fā)生改變的Session對象復(fù)制給其他服務(wù)器。保證了在某臺服務(wù)器停止工作后可以由其他服務(wù)器來接替它與客戶端的會話 3,,在一個web應(yīng)用程序重啟時,,服務(wù)器也會持久化該應(yīng)用程序中所有HttpSession對象,保證客戶端的會話活動仍可以繼續(xù),。 Tomcat使用Session Manager 類來管理Session的持久化,,他提供了兩個SessionManager類 org.apache.catalina.session.StandardManager org.apache.catalina.session.PersistentManager StandardManager是tomcat默認(rèn)使用的,在web應(yīng)用程序關(guān)閉時,,對內(nèi)存中的所有HttpSession對象進(jìn)行持久化,,把他們保存到文件系統(tǒng)中。默認(rèn)的存儲文件為 <tomcat 安裝目錄>/work/Catalina/<主機(jī)名>/<應(yīng)用程序名>/sessions.ser PersistentManager比StandardManager更為靈活,,只要某個設(shè)備提供了實現(xiàn)org.apache.catalina.Store接口的驅(qū)動類,,PersistentManager就可以將HttpSession對象保存到該設(shè)備
|