書名: JSP應用與開發技術(第3版)作者名: 馬建紅 李學相 韓穎 王瑞娟 張晗本章字數: 1662字更新時間: 2020-06-30 17:13:28
5.5 實現會話追蹤的4種方式
會話追蹤的實現方式有下列4種方式:
(1)使用持續Cookies(Persistent Cookies)。
(2)重寫包含額外參數的URL(URL Rewriting)。
(3)建立含有數據的隱藏表單字段(Hidden Form Field)。
(4)使用內建session對象。
前3種會話追蹤方式是傳統的做法,每種做法都有缺點。最后1種方法是目前最常用,也是最有效的解決方案,因此在本節中將把討論重心放在第4種會話追蹤方式上,然而為求徹底了解會話追蹤的機制,還是先將傳統的會話追蹤方式做一番介紹。
5.5.1 Cookies和URL重寫
Cookie是一個小小的文本文件,它是將會話信息記錄在這個文本文件內,每個頁面都去Cookie中提取以前的會話信息。用戶請求到達服務器后,先從Cookie中取出會話信息。這樣就實現了會話追蹤,前面章節已經介紹過,不再贅述。
雖然Cookie強大且持續性高,但是由于有些用戶因為擔心Cookie對個人隱私的威脅,會關閉Cookie,一旦如此,便無法利用Cookie來達到會話追蹤的功能。
URL重寫是利用get方法,在URL的尾部添加一些額外的參數來達到會話追蹤(session tracking)的目的,服務器將這個標識符與它所存儲的有關會話的數據關聯起來。URL看起來如【例5-3】所示:http://localhost:8080/ch05/jsessionid2.jsp;jsessionid=989A54B6B8DAD17453C36C 79C32748EE。
使用URL重寫的優點是Cookie被禁用或者根本不支持的情況下依舊能夠工作。但也有很多缺點:
必須對所有指向某用戶的網站的URL進行編碼。
所有頁面必須動態生成。
不能使用預先記錄下來的URL進行訪問,或者從其他網站鏈接進行訪問。
5.5.2 隱藏表單字段
隱藏表單字段的方法,是利用HTML內的Hidden屬性,把客戶端的信息,在用戶不察覺的情形下,偷偷地隨著請求一起傳送給服務器處理,這樣一來,就可以進行會話跟蹤的任務了。然后將重要的用戶信息,如ID之類獨一無二的數據,以隱藏字段的方式傳送給服務器。隱藏字段的優點在于session數據傳送到服務器端時,并不用像get方法,會將session數據暴露在URL之上。不過這種做法還是有它的缺點:一旦session數據存儲在隱藏字段中,仍然有暴露數據的危機,因為只要用戶直接查看HTML的源文件,session數據將會暴露無遺。這將造成安全上的漏洞,特別當用戶數據是依賴于用戶ID、密碼來取得的時候,將會有被盜用的危險。
5.5.3 使用內建session對象
傳統的會話追蹤方式使用比較麻煩,JSP使用內建的session對象可以非常方便地實現會話追蹤,JSP的會話機制基于Cookie或URL重寫技術,融合了這兩種技術的優點,當客戶端允許使用Cookie時,內建session對象使用Cookie進行會話追蹤,如果客戶端禁用Cookie,則選擇使用URL重寫。
(1)獲取session對象。例如把購物車作為屬性存儲在session中,在其他JSP頁面中可以通過session再獲得購物車。
//在JSP 頁面中可以直接使用session ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
內建的session對象是javax.servlet.http.HttpSession類的實例,如果在JavaBean或者Servlet中使用session就需要先從當前的request對象中取得,例如:
//得到用戶session和購物籃 HttpSession session = request.getSession(); ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
(2)讀寫session中的數據。向session中存入對象使用setAttribute方法,通過getAttribute方法讀取對象。從session返回的值注意要轉換成合適的類型,要注意檢查結果是否為null。例如下面一段代碼:
HttpSession session = request.getSession(); SomeClass value = (SomeClass)session.getAttribute("someID"); if (value == null) { value = new SomeClass(...); session.setAttribute("someID", value); } doSomethingWith(value);
(3)廢棄session數據。調用removeAttribute廢棄session中的值,即移除與名稱關聯的值。調用invalidate廢棄整個session,即廢棄當前的session。如果用戶注銷離開站點,注意廢棄與用戶相關聯的所有session。
(4)session的生命周期。由于沒有辦法知道HTTP客戶端是否不再需要session,因此每個session都關聯一個時間期限使它的資源可以被回收。
(5)服務器使用URL重寫。session默認使用Cookie技術進行會話追蹤,如果客戶端不接受Cookie的時候,服務器可以利用URL重寫的方式將sessionID作為參數附在URL后面,此時須利用response對象內的encodeURL或encodeRedirectURL方法,這兩個方法首先判斷Cookies是否被瀏覽器支持;如果支持,則參數URL被原樣返回,sessionID將通過Cookies來維持。否則返回帶有sessionID的URL。同時需要注意的是,將session的ID以URL的編碼方式進行時,需將每一頁都編碼,才能保留住session的ID。如果遇到沒有編碼的URL,則無法進行會話跟蹤。
(6)內建session對象使用示例。下面是一個記錄同一用戶到站次數的計數器,該實例包含一個文件sessionCounter.jsp。sessionCounter.jsp的完整程序代碼如下:

sessionCounter.jsp記錄單一用戶每次光臨的次數。首先,從session內取出accessCount的值,如果值為null,代表用戶第一次光臨,就將accessCount設為0,將heading設為“Welcome,Newcomer”;如果值不為null,則把accessCount的值加1,將heading設為“Welcome Back”。
sessionCounter.jsp的初次執行結果如圖5-13所示。sessionCounter.jsp的多次執行結果如圖5-14所示。

圖5-13 sessionCounter.jsp的初次執行效果

圖5-14 sessionCounter.jsp的多次執行效果
- PyQt從入門到精通
- Hands-On C++ Game Animation Programming
- Java EE 7 Development with NetBeans 8
- 焊接機器人系統操作、編程與維護
- Mastering Xamarin.Forms(Second Edition)
- Machine Learning in Java
- 網絡數據采集技術:Java網絡爬蟲實戰
- Moodle 3 Administration(Third Edition)
- 現代C++語言核心特性解析
- Flutter從0基礎到App上線
- Go語言高級編程(第2版)
- Learning jqPlot
- Neo4j權威指南 (圖數據庫技術叢書)
- WCF 4.5 Multi-Layer Services Development with Entity Framework(Third Edition)
- Salt Cookbook