一、什麼是狀態管理
將客戶端與伺服器之間多次交互當做一個整體來看,並且將多次交互所涉及的數據(狀態)保存下來。
會話:當用戶打開瀏覽器,訪問多個WEB資源,然後關閉瀏覽器的過程,稱之為一個會話,選項卡,彈出頁面都屬於這個會話,且共享同一個session。
注意:具體會話和瀏覽器版本,廠商有關,如IE7及以下,每開一個瀏覽器都創建一個新的session,而IE8及以上,則實現多個瀏覽器共享同一個session。因為IE8及以上,都共享同一個進程,只開闢一個內存空間。目前較多主流的瀏覽器都實現同一臺主機上的多個瀏覽器,共享同一個進程。
二、如何進行狀態管理
方式一:將狀態保存在客戶端。方式二:將狀態保存在伺服器端。
三、cookie技術(客戶端技術)
(1)什麼是cookie
a、cookie是一種客戶端的狀態管理技術b、當瀏覽器向伺服器發送請求的時候,伺服器會將少量的數據以set-cookie消息頭的方式發送給瀏覽器,當瀏覽器再次訪問伺服器時,會將這些數據以cookie消息頭的方式發送給伺服器。
(2)如何創建一個cookie
Cookie c = new Cookie(String name,String value);response.addCookie(c);默認情況下,cookie保存在瀏覽器內存中
(3)cookie的查詢
Cookie[] cookie = request.getCookies();
注意:該方法有可能返回nullString cookie.getName():查找cookie的名字String cookie.getValue():查找cookie的值
(4)cookie的生存時間
cookie.setMaxAge(int seconds):cookie的保存時間seconds>0:瀏覽器會將cookie保存在硬碟上,超過指定時間會刪除該cookieseconds<0:預設值,只將cookie保存在內存中,只要瀏覽器不關閉,cookie就一致保存,瀏覽器一旦關閉,cookie就會被清空。seconds=0:立即刪除cookie,如要刪除一個叫userID的cookie,那麼可以這麼做:Cookiec = new Cookie("userID","");c.setMaxAge(0);response.addCookie(c);
(5)cookie的編碼問題
cookie只能保存ascii字符,對於不合法的字符(如中文)需要轉換成ascii碼
例:Cookie cookie3 = new Cookie("realname",URLEncoder.encode("姓名","utf-8"));
(6)cookie的路徑問題
a、什麼是cookie的路徑問題?瀏覽器在向伺服器發送請求時,會比較cookie的路徑要與訪問的伺服器的路徑是否匹配,只有匹配的cookie才會發送給伺服器。b、cookie的默認路徑默認路徑等於創建該cookie的組件路徑c、匹配規則瀏覽器要訪問的路徑必須是cookie的路徑或者其子路徑時,才會發送對應的cookied、設置cookie的路徑cookie.setPath(String path)如:cookie.setPath("/appname");這樣保證這個cookie可以被整個web應用訪問。
(7)cookie域
setDomain:設置cookie域,指的是訪問某個域的時候,才會帶入cookie,訪問其他域,不會帶入cookie。默認會禁止該設置,因為安全性較差,如,訪問baidu.com,baidu.com寫一個域是google.com的cookie,那麼訪問google.com的時候會帶入baidu.com的cookie,從而會實現攻擊的效果。
(8)cookie的限制
a、cookie可以被用戶禁止b、cookie不完全,敏感數據,比如密碼、帳號等需要加密。c、cookie的大小有限制,大約為4K左右d、cookie的個數也有限制,大約是300個左右e、每個站點最多保存20個cookief、cookie只能夠保存字符串。
四、session技術(伺服器端)
(1)什麼是session?
a、session是一種伺服器端的狀態管理技術。b、session是基於cookie的技術。c、當瀏覽器訪問伺服器時,伺服器會創建一個session對象(該對象有一個唯一的id號,稱之為sessionId)伺服器在默認的情況下,會將sessionId以cookie的方式,發送給瀏覽器,瀏覽器會將sessionId保存到內存中。當瀏覽器再次訪問伺服器時,會將sessionId發送給伺服器,伺服器依據sessionId就可以找到之間創建的session對象。
(2)如何獲取session對象?
方式一:HttpSession s = request.getSession(boolean flag);當flag=true時,伺服器會先查看請求當中有沒有sessionId,如果沒有,則創建一個session對象。如果有,會依據sessionId查找對應的session對象。如果找到,則返回該session對象,如果找不到,則創建一個新的session對象。當flag=false時,伺服器會先查看請求當中有沒有sessionId,如果沒有則返回null,如果有,會依據sessionId查找對應的session對象。如果找到,則返回該session對象,如果找不到,返回null。方式二:HttpSession s = request.getSession();等價於request.getSession(true);
(3)常用方法
String serssion.getId();// 得到session的ID
session.setAttribute(String name,Object obj);// obj最好實現序列化Serializable接口,應為伺服器在持久化session時,會使用java序列化協議。
session.getAttribute(String name);// 如果name不存在則返回null
session.removeAttribute(String name);// 刪除session中的指定屬性
(4)session超時
所謂session的超時,指的是伺服器會將空閒時間過長的session對象從內存空間刪除掉,原因是過多的session對象會影響程序的正常運行,會佔用伺服器的內存空間。大部分伺服器都會有一個預設的超時限制,一般是30分鐘,可以修改伺服器的預設超時限制。如修改tomcat的session超時時間,可以在conf/web.xml中的
<session-config><session-timeout>30</session-timeout></session-config>
也可以將以上配置放到某個WEB應用的web.xml中,這樣可以特定設置某個WEB應用的session超時時間。另外,還可以通過session.setMaxInactiveInterval(int seconds);設置session的超時時間。
(5)session的生命周期
session的創建:當用戶訪問某個可以創建session的servlet的時候,該servlet才會創建session。當session超過默認時間或用戶指定的session時間後,session才會消亡。
(6)刪除session
session.invalidate();
(7)持久化session方案
session默認是存儲在瀏覽器內存中,默認時間是30分鐘(根據不同的WEB伺服器設置而定)。且session也是通過cookie來實現發送到瀏覽器內存中的。所以可以考慮用cookie來替換該session。如果用戶在中途關閉瀏覽器的話,那麼session就隨著瀏覽器內存的釋放而釋放,那麼如果想持久化session的話,可以考慮使用cookie技術。
Step1、獲取sessionID。Step2、通過JSESSIONID,然後將sessionID的值寫入cookie,在通過設置保存時間,路徑,來持久化該session。
(8)URL地址編碼(用戶禁用cookie的解決辦法)
如果用戶禁用了cookie,那麼在編寫超連結的時候,必須使用URL編碼,即:
response. encodeURL(url);
什麼是URL重寫?
簡單的說,如果某個組件需要session機制的支持,且用戶禁止了cookie,則不能直接使用該組件的地址去訪問,而應該使用伺服器生成的組件的地址(會在組件的地址後面添加sessionId)去訪問。如何重寫?
用在連接地址,表單提交地址。
response.encodeURL(String url);
如果是重定向。
sesponse.encodeRedirectURL(「list.jsp」);
這樣編譯過的URL地址就會自動在後面添加用戶session的id號,那麼所有的連接地址就會按如下格式進行輸出,即每個地址都記錄了用戶的信息:
href='/JavaWeb/servlet/BuySession;jsessionid=283087307F0E79CC62208BDCF79FC52A'
這種方式不能實現用戶數據持久化。
(9)session的相關細節
如果即使用了URL地址編碼,也設置了寫出cookie,那麼第一次訪問的時候伺服器會即帶入cookie同時也進行URL地址編碼,當再次訪問伺服器時,伺服器已經判斷出了瀏覽器是否禁用了cookie,如果沒有禁用,則使用cookie寫入的方式,如果禁用了則使用URL地址編碼的方式
(10)session的優缺點
優點:1、session相對安全。2、session能夠保存的數據類型更豐富。3、session能夠保存的數據大小沒有限制。
缺點:1、session需要將所有數據寫在伺服器端,所以伺服器會佔用過多的內存空間,會影響伺服器性能。可以考慮使用cookie或資料庫來保存數據。
(11)session案例
a、session登錄驗證
step1、在登錄成功以後,在session對象上綁定數據,比如:session.setAttribute(「user」,user);step2、對需要保護的資源(只有登錄成功以後才能訪問的資源,比如主頁),添加session驗證代碼:Object obj = session.getAttribute(「user」);If(obj==null)就跳轉到登錄界面
b、驗證碼生成一個驗證碼,然後將驗證碼存儲到session中,然後從session中取出驗證碼與客戶提交的驗證碼進行比對,這是一個典型的session應用。