專攻知識小點——回顧JavaWeb中的servlet(三)
HttpSession基本概述
**
**
1.HttpSession:是伺服器端的技術。和Cookie一樣也是伺服器和客戶端的會話。獲得該對象是通過HTTPServletRequest的方法getSession()方法。此方法還有一個重載形式的方法,裡面傳入的是boolean類型。當為true時,功能不變;為false時,只查詢。
2.HttpSession的底層其實就是Cookie的實現方式:即根據特殊的Cookie(JSESSIONID=HttpSession對象的id,由伺服器生成,唯一的)的取值,在伺服器的記憶體中根據此id進行查找這個HttpSession對象,找到了就繼續服務;沒有找到就創建一個新的HttpSession對象。
3.Session的運行機制:
a)當一個Session開始時,Servlet容器將創建一個HttpSession對象,在HttpSession對象中可以存放客戶狀態的資訊(例如購物車)
b)Servlet容器為HttpSession分配一個唯一的標誌符,稱為Session ID,Servlet容器把Session ID作為Cookie保存客戶的瀏覽器中
c)每次客戶發出HTTP請求時,Servlet容器可以從HttpServletRequest對象中讀取Session ID,然後根據Session ID找到響應的HttpSession對象,從而獲取到客戶的狀態資訊。
4.HttpSession的常用方法:
a)public Object getAttribute(String name):返回與此會話中的指定名稱綁定在一起的對象,如果沒有對象綁定在該名稱下,則返回 null。
b)public void setAttribute(String name, Object value):使用指定名稱將對象綁定到此會話。如果具有同樣名稱的對象已經綁定到該會話,則替換該對象。
c)public void removeAttribute(String name):從此會話中移除與指定名稱綁定在一起的對象。如果會話沒有與指定名稱綁定在一起的對象,則此方法不執行任何操作。
d)public void invalidate():使此會話無效,然後取消對任何綁定到它的對象的綁定。
5.HttpSession對象的狀態及轉換(序列化)
a)更改記憶體中HttpSession對象的超時時間,可以通過修改web應用的web.xml文件,根元素下添加:
b)所有的bean對象最好都要實現一個Serializable介面,這樣伺服器就會在禁用此web應用時,用戶的數據不會丟失,進行持久化存儲。
HttpSession的案例
**
**
1.案例一:完成用戶的一次性登錄,用隨機動態驗證碼的來進行驗證。
細節程式碼1:
使用HttpSession存儲隨機生成的驗證碼
request.getSession().setAttribute("code", sb.toString());
從網頁上得到的隨機驗證碼:
String code = request.getParameter("code");
使用HttpSession獲得隨機生成的驗證碼
String sessionCode = (String) request.getSession().getAttribute("code");
然後就可以判斷code和sessionCode是否相等來進行響應的處理。
細節程式碼2:
指定秒數跳轉到某個頁面:response.setHeader(“Refresh”, “2;URL=/day08”);
細節程式碼3:
兩種銷毀HttpSession的方式:
a)銷毀所有的HttpSession對象:request.getSession().invalidate();
b)銷毀指定的HttpSession對象:request.getSession().removeAttribute(“user”);
2.案例二:簡單購物原理案例,可以查看購物車,添加商品進購物車。
細節程式碼1:
當被鏈接的地址想要收到上一個地址的id來進行邏輯處理,可以在鏈接後面加上?id=2。如:購買。
細節程式碼2:
搞一個購物車:先查有無購物車,沒有,給你一個。有就直接用。
HttpSession session = request.getSession(); //得到cart的session值,值是List。 List<Book> cart = (List<Book>) session.getAttribute("cart"); //得到的值是空,就沒有購物車 if(cart==null){//創建一個購物車 cart = new ArrayList<Book>();. session.setAttribute("cart", cart); } cart.add(book);
細節程式碼3:
查看購物車時,如何判斷購物車是否有貨。
HttpSession session = request.getSession(false); if(session==null){ out.write("對不起!您還未曾購物"); }else{ List<Book> cart = (List<Book>) session.getAttribute("cart"); if(cart==null){ out.write("對不起!您還未曾購物"); }else{ out.write("您購買的商品如下:<br/>"); for(Book b:cart){ out.write(b.getName()+"<br/>"); } } }
細節程式碼4:
當我們希望用戶在下次打開瀏覽器還能查看購物車裡東西,可以使用Cookie對象,存儲特定的資訊(HttpSession的底層原理)。
3.案例3:防止表單的重複提交。
細節程式碼1:
在客戶端,可以使用js腳本語言讓用戶提交一次後,按鈕變灰。
form表單的寫法:
<form id='f1' action=」 RegistServlet」 method=』post』> <input id='bt1' type='button' value='註冊' onclick='toSubmit()'/></form>
js實現提交一次後按鈕變灰
<script type='text/javascript'>function toSubmit(){ document.getElementById('f1').submit();//按鈕具備提交功能 document.getElementById('bt1').disabled=true;//提交一次變灰}</script>
細節程式碼2:
md5演算法的實現
MessageDigest md = MessageDigest.getInstance("md5"); byte b[] = md.digest(message.getBytes()); BASE64Encoder base64 = new BASE64Encoder(); return base64.encode(b);//採用Base64編碼轉換位元組序列為明文。
細節程式碼3:
可以在提交表單中增加一個type是hidde,來存儲md5的演算法後的數據,然後用session同時去存儲md5的演算法後的數據。數據指紋的演算法好處是數據無論怎麼變,長度始終一樣。
<input type='hidden' name='token' value='"+token+"'/> ---------------------------------------------------------------------------------------------------------- //生成一個隨機的令牌String token = ""+System.currentTimeMillis()+new Random().nextLong();//算數據指紋,用MD5演算法。token = MD5Util.md5(token); //放入HttpSession中 request.getSession().setAttribute("token", token);
還有種方式是不用md5演算法來生成唯一的一段序列:java.util.UUID:通用的唯一標識符
String token = UUID.randomUUID().toString();//唯一的一段序列。
細節程式碼4:
驗證表單提交的hidde類型的令牌與伺服器的令牌是否一致。
String formToken = request.getParameter("token"); String sessionToken = (String) request.getSession().getAttribute("token"); if(formToken.equals(sessionToken)){ //正常提交 System.out.println("保存了:"+name); request.getSession().removeAttribute("token"); }else{ out.write("請不要重複提交"); }
3.案例3:客戶端禁用Cookie後的會話數據保存問題。禁用Cookie時,輸入//localhost還是可以保存數據的。當輸入的地址非這個時,數據就無法保存。兩種解決方法。
a)將URL重寫:當URL重寫時,既是用戶訪問資源時,瀏覽器地址欄會始終帶著JSESSIONID=123。HttpServletResponse類里有一個智慧方法encodeURL(String url),判斷用戶是否禁用了Cookie,沒有禁用,則不重寫;禁用了就重寫。
b)在網站主頁提示:為了更好訪問本網站,請不要禁用您的Cookie。這種方式適用於大型網站重寫URL費力的做法。
END
如果看到這裡,說明你喜歡這篇文章,請 轉發、點贊。同時 標星(置頂)本公眾號可以第一時間接受到博文推送。
關注公眾號「IT鹹魚」學習更多有關知識。
獲取方法:
1、掃描下方二維碼並關註:IT鹹魚
2、在IT鹹魚對話框回復關鍵詞:”資料” 一併奉上。
3、也可直接添加小編微信:mu99908888 領取