官术网_书友最值得收藏!

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的多次執行效果

主站蜘蛛池模板: 三亚市| 靖西县| 松溪县| 柳江县| 丹东市| 和林格尔县| 龙海市| 莱州市| 麻江县| 喀什市| 岳普湖县| 星座| 贵州省| 左云县| 无棣县| 太仆寺旗| 大港区| 石柱| 城口县| 丁青县| 凭祥市| 闽清县| 北安市| 加查县| 浦城县| 科技| 潞西市| 广东省| 东港市| 洪江市| 南雄市| 泸西县| 深圳市| 滕州市| 肥城市| 同德县| 泰宁县| 宁河县| 昭平县| 沙河市| 方正县|