一,會(huì)話跟蹤(session tracking)技術(shù)
會(huì)話是客戶端發(fā)送請(qǐng)求,服務(wù)器返回響應(yīng)的連接時(shí)間段。
HTTP是無(wú)狀態(tài)協(xié)議:每次都是單獨(dú)連接,不能維持客戶的上下文信息。
會(huì)話跟蹤技術(shù)是用于維持客戶端和服務(wù)器端通信信息的技術(shù)。
三種典型客戶端會(huì)話跟蹤解決方案:
1,Cookie;
2,URL重寫(xiě);
3,隱藏表單域;
二,會(huì)話Cookie
用于會(huì)話跟蹤的Cookie叫做會(huì)話Cookie。Servlet規(guī)范中會(huì)話跟蹤的cookie名字必須是JSESSIONID,保存在瀏覽器的內(nèi)存中。區(qū)別于保存在外部存儲(chǔ)設(shè)備的cookie。
對(duì)于存儲(chǔ)在內(nèi)存中的cookie,是不能被不同的瀏覽器進(jìn)程共享,共享只能發(fā)生在同一個(gè)瀏覽器進(jìn)程的不同窗口(對(duì)個(gè)窗口共享一個(gè)進(jìn)程)中。對(duì)于存儲(chǔ)在外部設(shè)備的cookie,可以多瀏覽器共享。
三,url重寫(xiě)
在瀏覽器不支持或禁用cookie的情況下,使用url重寫(xiě)代替cookie來(lái)跟蹤用戶會(huì)話。
每個(gè)頁(yè)面都必須使用servlet或jsp動(dòng)態(tài)生成(動(dòng)態(tài)頁(yè)面)。因?yàn)楦郊釉赨RL上的sessionID是動(dòng)態(tài)產(chǎn)生,所以對(duì)于靜態(tài)頁(yè)面的跳轉(zhuǎn),URL重寫(xiě)機(jī)制無(wú)能為力。
即使使用動(dòng)態(tài)頁(yè)面,如果用戶離開(kāi)了會(huì)話并且通過(guò)書(shū)簽或鏈接再次回來(lái),會(huì)話信息也會(huì)丟失,因?yàn)榇鎯?chǔ)下來(lái)的鏈接含有錯(cuò)誤的標(biāo)識(shí)信息。
必須將所有發(fā)送到客戶端的url進(jìn)行編碼,調(diào)用HttpServletResponse接口中的encodeURL()方法和 encodeRedirectURL()方法來(lái)實(shí)現(xiàn)。在調(diào)用sendRedirect()方法之前使用encodeRedirectURL()方法.
四,隱藏表單域
只能用于特定操作中。僅當(dāng)每個(gè)頁(yè)面都由表單提交而動(dòng)態(tài)生成的時(shí)候,才可以使用隱藏表單域,用來(lái)存儲(chǔ)相關(guān)會(huì)話信息。
五,servlet中的會(huì)話跟蹤
javax.servlet.http.HttpSession接口是servlet提供會(huì)話跟蹤解決方案。
HttpSession對(duì)象存放在服務(wù)器端,只是對(duì)cookie和url重寫(xiě)技術(shù)的封裝應(yīng)用,所以要求服務(wù)器支持cookie,可以全局切換到url重寫(xiě)。
1,訪問(wèn)與當(dāng)前請(qǐng)求相關(guān)聯(lián)的會(huì)話對(duì)象:getSession(boolean value)方法
在會(huì)話過(guò)程中,web容器負(fù)責(zé)為客戶端維護(hù)一個(gè)唯一的HttpSession對(duì)象。
對(duì)于新會(huì)話,web容器創(chuàng)建使用實(shí)現(xiàn)了HttpSession接口的HttpSession對(duì)象封裝當(dāng)前請(qǐng)求會(huì)話的信息(散列表的方式存儲(chǔ))。
使用HttpServletRequest的getSession()方法訪問(wèn)HttpSession對(duì)象。
在后臺(tái),系統(tǒng)從cookie或URL重寫(xiě)附加的數(shù)據(jù)中提取出用戶ID。以ID為key,遍歷之前創(chuàng)建的HttpSession對(duì)象內(nèi)建的散列表。
如果找不到匹配的會(huì)話ID,系統(tǒng)重新創(chuàng)建一個(gè)新的會(huì)話。默認(rèn)情況下(不禁用Cookie)還會(huì)創(chuàng)建一個(gè)名為JSESSIONID,值為唯一標(biāo)識(shí)用戶表示會(huì)話ID的輸出cookie。
因?yàn)檎{(diào)用getSession()方法會(huì)影響到后面的響應(yīng),所以只能在發(fā)送任何文檔內(nèi)容到客戶端之前調(diào)用getSession()方法。
區(qū)別:getSession(boolean value)方法:如果系統(tǒng)沒(méi)有找到與請(qǐng)求關(guān)聯(lián)的會(huì)話ID,true表示返回新會(huì)話。false表示方法返回null。
2,訪問(wèn)和設(shè)置與會(huì)話相關(guān)聯(lián)信息,維護(hù)會(huì)話的狀態(tài):HttpSession的getAttribute()方法和setAttribute()方法
散列表:HttpSession對(duì)象內(nèi)建數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ) 當(dāng)前請(qǐng)求會(huì)話的數(shù)據(jù)(會(huì)話的屬性)。可以存儲(chǔ)任意數(shù)量的key-value對(duì)。
使用HttpSession的getAttribute()方法和setAttribute(String key,Object value)方法讀取和設(shè)置當(dāng)前請(qǐng)求會(huì)話數(shù)據(jù)(即對(duì)散列表的操作),維護(hù)會(huì)話的狀態(tài)。
setAttribute方法會(huì)替換任何之前的屬性。如果不想被替換,則需要在設(shè)置之前使用removeArrtibute(String key)方法移除該屬性。
setAttribute方法會(huì)觸發(fā)所有實(shí)現(xiàn)了HttpSessionBindingListener接口的valueBound方法,做一些初始化狀態(tài)的操作。
removeArrtibute方法會(huì)觸發(fā)所有實(shí)現(xiàn)了HttpSessionBindingListener接口的valueUnbound方法,做一些消除狀態(tài)的操作。
對(duì)于分布式WEB應(yīng)用程序,將web應(yīng)用程序標(biāo)記為可分布式執(zhí)行,系統(tǒng)需要能夠?qū)?huì)話對(duì)象在機(jī)器之間傳遞,這時(shí)需要將會(huì)話的屬性實(shí)現(xiàn)Serializable接口。
3,廢棄會(huì)話數(shù)據(jù)
只移除自己編寫(xiě)的的servlet創(chuàng)建的數(shù)據(jù):removeArrtibute(String key)方法
(web應(yīng)用程序中刪除)刪除整個(gè)會(huì)話:invalidate()方法,可以用該方法注銷用戶。
(Web服務(wù)器中刪除)將用戶從系統(tǒng)中注銷并且刪除所有與該會(huì)話關(guān)聯(lián)的會(huì)話:logout()方法。一定要與其他web應(yīng)用程序協(xié)調(diào)loggout命令的使用。
4,會(huì)話超時(shí)時(shí)間間隔
getMaxInactiveInterval()方法和setMaxInactiveInterval()方法讀取和設(shè)置在沒(méi)有訪問(wèn)的情況下,會(huì)話保存的最長(zhǎng)時(shí)間。秒為單位。負(fù)數(shù)表示會(huì)話從不超時(shí)。超時(shí)由服務(wù)器來(lái)維護(hù)。
5,會(huì)話最后次被客戶端訪問(wèn)的時(shí)間:getLastAccessedTime()方法
可以用來(lái)確定客戶端在二次請(qǐng)求之間會(huì)話的非活動(dòng)時(shí)間。
6,獲取會(huì)話被創(chuàng)建的時(shí)間:getCreationTime()方法 返回long類型數(shù)據(jù)
7,返回分配給session的唯一標(biāo)識(shí)ID,為字符串。getId()方法
六,瀏覽器會(huì)話與服務(wù)器會(huì)話
瀏覽器會(huì)話
默認(rèn)情況下,會(huì)話跟蹤基于存儲(chǔ)在瀏覽器內(nèi)存中的cookie,區(qū)別于存儲(chǔ)在外圍存儲(chǔ)設(shè)備上的cookie。
需要servlet顯示的讀取JSESSION cookie,設(shè)置最大時(shí)效和路徑并添加到客戶端,否則退出瀏覽器就會(huì)中斷會(huì)話。
服務(wù)器會(huì)話
服務(wù)器需要將會(huì)話保存在內(nèi)存中,在會(huì)話處于非活動(dòng)狀態(tài)超過(guò)設(shè)定的間隔(會(huì)話超時(shí))就移除會(huì)話。
七,對(duì)綁定到session中的對(duì)象(屬性)初始化和消除狀態(tài)。HttpSessionBindingListener監(jiān)聽(tīng)器接口和HttpSessionBindingEvent事件類。
Servlet容器通過(guò)實(shí)現(xiàn)HttpSessionBindingListener監(jiān)聽(tīng)器接口的監(jiān)聽(tīng)器來(lái)監(jiān)聽(tīng)HttpSessionBindingEvent事件。
HttpSessionBindingListener監(jiān)聽(tīng)器接口方法:
1,valueBound(HttpSessionBindingEvent event):對(duì)象被綁定到session中時(shí)該方法通知對(duì)象。做初始化操作。
2,valueUnbound(HttpSessionBindingEvent event): 對(duì)象被移除出session時(shí)該方法通知對(duì)象。做消除狀態(tài)操作。
HttpSessionBindingEvent事件方法:
1,getName():獲取觸發(fā)事件的屬性的名字。
2,getValue():獲取觸發(fā)事件的屬性的值。
3,getSession():返回Session對(duì)象。
八,在 Java Servlet API中有關(guān)的監(jiān)聽(tīng)器接口。
與Session相關(guān)的監(jiān)聽(tīng)器接口
javax.servlet.http.HttpSessionActivationListener:如果綁定到Session中,當(dāng)Session被鈍化或激活時(shí),Servlet容器將通知該對(duì)象。
javax.servlet.http.HttpSessionAttributeListener:如果想要在Session中的屬性列表發(fā)生改變時(shí)得到通知,可以實(shí)現(xiàn)這個(gè)接口。
javax.servlet.http.HttpSessionListener:如果需要在Session創(chuàng)建后或者Session無(wú)效前得到通知,可以實(shí)現(xiàn)這個(gè)接口,實(shí)現(xiàn)該接口的類必須在web應(yīng)用程序的部署描述符中進(jìn)行配置。
與Servlet上下文有關(guān)的監(jiān)聽(tīng)器接口:
javax.servlet.ServletContextAttributeListener:在Servlet上下文中的屬性列表發(fā)生改變時(shí)得到通知,可以實(shí)現(xiàn)這個(gè)接口,實(shí)現(xiàn)該接口的類必須在web應(yīng)用程序的部署描述符中進(jìn)行配置。
javax.servlet.ServletContextListener:如果需要在Servlet上下文對(duì)象初始化時(shí)或被銷毀的時(shí)候得到通知,可以實(shí)現(xiàn)這個(gè)接口,實(shí)現(xiàn)該接口的類必須在web應(yīng)用程序的部署描述符中進(jìn)行配置。
與請(qǐng)求相關(guān)的監(jiān)聽(tīng)器接口:servlet2.4規(guī)范定義
javax.servlet.ServletRequestAttributeListener:Servlet請(qǐng)求對(duì)象中的屬性發(fā)生改變時(shí)得到通知。
javax.servlet.ServletRequestListener:請(qǐng)求對(duì)象初始化或者被銷毀時(shí)得到通知。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。