專攻知識小點——回顧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文件,根元素下添加:

1

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 領取

Tags: