1. 程式人生 > >四種會話跟蹤方法

四種會話跟蹤方法

前段時間看到web中會話跟蹤技術,經過收集並整理將學習結果記錄在此。

1.什麼是會話
客戶端開啟與伺服器的連線發出請求到伺服器響應客戶端請求的全過程稱之為會話 。
2.什麼是會話跟蹤
對同一個使用者對伺服器的連續的請求和接受響應的監視 。
3.為什麼需要會話跟蹤
瀏覽器與伺服器之間的通訊是通過HTTP協議進行通訊的,而HTTP協議是”無狀態”的協議,它不能儲存客戶的資訊,即一次響應完成之後連線就斷開了,下一次的請求需要重新連線,這樣就需要判斷是否是同一個使用者,所以才應會話跟蹤技術來實現這種要求
4.介紹
當伺服器響應客戶端的第一次請求時,將會建立一個新的session物件(該物件實現了HttpSession介面)和一個唯一的ID分配給該請求,以後 客戶將此會話ID與請求一起傳給伺服器,此會話ID在後續的請求中會將使用者與session物件進行匹配,用於識別不同的客戶。
5.會話跟蹤常用的方法:


① URL重寫
URL(統一資源定位符)是Web上特定頁面的地址,URL重寫的技術就是在URL結尾新增一個附加資料以標識該會話,把會話ID通過URL的資訊傳遞過去,以便在伺服器端進行識別不同的使用者 。
如果使用者沒有禁用cookie,而且又使用URL重寫,則:使用者在第一次訪問EncodeURLServlet時,由於不知道使用者是否禁用了 cookie,所以response.encodeURL()方法內部會將JSESSIONID重寫在url上,但是一旦第二次訪問時,由於使用者是帶著 cookie來的,所以response.encodeURL()不會將JSESSIONID重寫在url上。
但是如果使用者禁用cookie,則關閉了瀏覽器後,重新開啟瀏覽器,則回話失效,無法實現回話跟蹤;如果是使用者沒有禁用cookie,則可以通過設定裝載JSESSIONID的cookie的失效時間來控制瀏覽器關閉後session仍未失效。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
         response.setCharacterEncoding("utf-8");  
         response.setContentType("text/html;charset=utf-8");  
         PrintWriter out = response.getWriter();  
         request.getSession
(); //建立session //呼叫response的encodeURL方法,將自動將JSESSION追加到url後面,如:url;jsessionid=BD111FFC653497E81B702A29B3AC6FE4 String buyurl = response.encodeURL("/CookieAndSession/servlet/buy"); String payurl = response.encodeURL("/CookieAndSession/servlet/pay"); out.print("<a href='"+buyurl+"'>購買</a><br/>"); out.print("<a href='"+payurl+"'>結賬</a><br/>"); }

② 隱藏表單域
將會話ID新增到HTML表單元素中提交到伺服器,此表單元素並不在客戶端顯示 。
③ Cookie
Cookie是Web伺服器傳送給客戶端的一小段資訊,客戶端請求時可以讀取該資訊傳送到伺服器端,進而進行使用者的識別。對於客戶端的每次請求,伺服器都會將Cookie傳送到客戶端,在客戶端可以進行儲存,以便下次使用。
客戶端可以採用兩種方式來儲存這個Cookie物件,一種方式是儲存在客戶端記憶體中,稱為臨時Cookie,瀏覽器關閉後 這個Cookie物件將消失。另外一種方式是儲存在 客戶機的磁碟上,稱為永久Cookie。以後客戶端只要訪問該網站,就會將這個Cookie再次傳送到伺服器上,前提是 這個Cookie在有效期內。這樣就實現了對客戶的跟蹤。
Cookie是可以被禁止的。

//在伺服器端獲取Cookie
    Cookie[]cookies = request.getCookies();

for (int i = 0; cookies != null && i < cookies.length;i++) {
        Cookiecookie = cookies[i];

        System.put.println(cookie.getName());
  }
//在伺服器端設定Cookie
   String username = "sa";
   Cookie usernameCookie = new Cookie("username", username);
   response.addCookie(usernameCookie);

這裡寫圖片描述

如果maxAge為負數,則表示該Cookie僅在本瀏覽器視窗以及本視窗開啟的子視窗內有效,關閉視窗後該Cookie即失效。maxAge為負數的Cookie,為臨時性Cookie,不會被持久化,不會被寫入到Cookie檔案中。Cookie資訊儲存在瀏覽器記憶體中,因此關閉瀏覽器該Cookie就消失了。

Cookie預設的maxAge值為-1。
如果maxAge為0,則表示刪除該Cookie。Cookie機制沒有提供刪除Cookie的方法,因此通過設定該Cookie即時失效實現刪除Cookie的效果。失效的Cookie會被瀏覽器從Cookie檔案或者記憶體中刪除。
response物件提供的Cookie操作方法只有一個新增操作add(Cookie cookie)。要想修改Cookie只能使用一個同名的Cookie來覆蓋原來的Cookie,達到修改的目的。刪除時只需要把maxAge修改為0即可。
Cookie並不提供修改、刪除操作。如果要修改某個Cookie,只需要新建一個同名的Cookie,並新增到response中覆蓋原來的Cookie。
如果要刪除某個Cookie,只需要新建一個同名的Cookie,並將maxAge設定為0,並新增到response中覆蓋原來的Cookie。
④ Session
每一個使用者都有一個不同的session,各個使用者之間是不能共享的,是每個使用者所獨享的,在session中可以存放資訊。在伺服器端會建立一個session物件,產生一個sessionID來標識這個session物件,然後將這個sessionID放入到Cookie中傳送到客戶端,下一次訪問時,sessionID會發送到伺服器,在伺服器端進行識別不同的使用者。Session是依賴Cookie的,如果Cookie被禁用,那麼session也將失效。因為Session是用Session ID來確定當前對話所對應的伺服器Session,而Session ID是通過Cookie來傳遞的,禁用Cookie相當於失去了Session ID,也就得不到Session了。此時可以考慮URL重寫和表單隱藏域。

原理:在後臺,系統從cookie或者url中提取使用者ID,這些動作對程式設計師是透明的,你只需呼叫getSession,
如果在輸入的cookie和url中找不到會話ID,系統會建立一個新的空會話。如果使用的是cookie(預設),系統還會建立一個名為
JSESSIONID的輸出cookie,在其中儲存一個唯一的值表示會話ID。(在伺服器端讀取的時候就是通過這個來識別Session的)
如果不存在會話的時候不想建立新的會話,可以使用HttpSession session = request.getSession(false);,如果不存在session物件就得到一個null值,並不建立空的session物件。

removeAttribute(“key”)  廢棄與指定鍵關聯的值
invalidate刪除整個會話(在當前web應用中)
logout將使用者從web伺服器中登出,並刪除所有屬於他的會
HttpSession session = request.getSession();

設定session的空閒失效時間有兩種方式:
1.在web.xml中設定:

   <session-config> 
      <session-timeout>2</session-timeout> 
   </session-config>  

2.設定session的maxInactiveInterval屬性,(session的 預設空閒失效時間為30分鐘,即30分鐘內不訪問伺服器,session將自動銷燬)如下:
session.setMaxInactiveInterval(2*60);
也可以通過 session.invalidate();銷燬session。