首頁 >後端開發 >php教程 >傳智播客會話管理教程

傳智播客會話管理教程

炎欲天舞
炎欲天舞原創
2017-08-24 11:02:531540瀏覽

課程介紹:

  1 載入web應用資源檔案

  2 cookie入門

  3 cookie詳解

  4 cookie案例-使用者上次造訪時間1

  5 cookie案例-使用者最後造訪時間2

  6 cookie案例-瀏覽過的商品

  7 session技術詳解

#播放位址:http://www.php.cn/course/564.html

講師特質:思路嚴謹,認真,懂得把握要點,讓同學知道什麼時候需要重點去記憶,學的輕鬆,學的快。

困難分析:cookie 原則要點;

##                 coookie與session的相同點與不同點;

      

課件下載位址:

http://www.php.cn/xiazai/code/2083

  因為HTTP協定時無狀態的協議,所以WEB伺服器對用戶的每次請求都當做是全新的請求。但是很

多WEB應用程式的需求中需要保存上一次請求的某些資訊。為了解決這個問題,會話與狀態管理的問

問題就產生了。在影片中,相關知識點包括:WEB應用程式中的會話與會話狀態,Cookie,在Servlet程式

中使用Cookie,Session,Session的典型案例,Session的持久化管理。

    所謂會話,是指一個客戶端瀏覽器與WEB伺服器之間連續發生的一系列請求和回應過程。 WEB應用程式

的會話狀態是指WEB伺服器與瀏覽器在會話過程中產生的狀態訊息,借助會話狀態,WEB伺服器能夠把

屬於同一會話中的一系列的請求和響應過程關聯起來。 例如某個使用者從網站的登入頁面登入後,再

進入購物頁面購物時,負責處理購物請求的伺服器程式必須知道處理上一次要求的程式所得到的使用者

#資訊.由於HTTP協定是一種無狀態的協議,WEB伺服器本身不能識別出哪些請求是同一個瀏覽器發出


的 ,瀏覽器的每一次請求都是完全孤立的。所以WEB伺服器端程式要能從大量的請求訊息中區分出哪

些請求訊息屬於同一個會話,也就是能辨識出來自同一個瀏覽器的存取請求,這需要瀏覽器對其發出的每個

個請求訊息都會標識,屬於同一個會話中的請求訊息都附帶同樣的標識號,而屬於不同會話的請求

訊息總是附帶不同的標識號,這個識別號碼就稱之為會話ID(SessionID)。 SessionID是由伺服器產生

並且傳遞給瀏覽器的,如果客戶端要接收並且回傳給伺服器進行驗證就需要相應的機制,這就是

Cookie技術,它不僅可以暫時接收並保存相應的會話訊息,也可以長時間記錄在客戶端硬碟上。

SessionID不僅可以透過Cookie的技術在請求訊息中進行傳遞,也可以作為請求URL的附加參數進行

傳遞。 SessionID是WEB伺服器為每個客戶端瀏覽器分配的一個唯一代號,它通常是在WEB伺服器接收到

某個瀏覽器的第一次存取時產生,並且隨同回應訊息一道傳送給瀏覽器。會話過程由WEB伺服器端的

程式開啟,一旦開啟了一個會話,伺服器端程式就要為這個會話創建一個獨立的儲存結構來保存該會

話的狀態信息,同一個會話中的存取請求都可以且只能存取屬於該會話的儲存結構中的狀態資訊。 

    Cookie是一種在客戶端維持HTTP狀態資訊的技術,它比商場發放的優惠卡好。 Cookie是在瀏覽

器存取WEB伺服器的某個資源時,由WEB伺服器在HTTP回應訊息標頭中附帶傳送給瀏覽器的一片數據,

WEB伺服器傳送給各個客戶端瀏覽器的資料是可以各不相同的。一旦WEB瀏覽器保存了某個Cookie,

那麼它在以後每次訪問該WEB伺服器時,都應在HTTP請求頭中將這個Cookie回傳給WEB伺服器。 WEB服

務器透過在HTTP回應訊息中增加Set-Cookie回應頭欄位將Cookie訊息傳送給瀏覽器,瀏覽器則透過

在HTTP請求訊息中增加Cookie請求頭欄位將Cookie回傳給WEB伺服器。一個Cookie只能識別一種資訊

,它至少含有一個標識該資訊的名稱(NAME)和設定值(VALUE)。一個WEB網站可以給一個WEB瀏覽器發送

送多個Cookie,一個WEB瀏覽器也可以儲存多個WEB網站提供的Cookie。

    程式中可用Set-Cookie和Set-Cookie2頭字段用於指定WEB伺服器傳送給客戶端的Cookie內容

,兩者只是使用的規格不同,但兩者的語法和作用類似。可以根據瀏覽器的支援情況選擇適當的回應

頭字段。 Set-Cookie2頭欄位中設定的cookie內容是具有一定格式的字串,它必須以Cookie的名稱

和設定值開頭,格式為"名稱=值",後面可以加上0個或多個以分號(;)和空格分隔的其它可選屬性,

屬性格式一般為"屬性名=值"。

   最後說明瀏覽器回傳Cookie的求求頭欄位。瀏覽器使用Cookie請求頭字段將Cookie資訊回送

給WEB伺服器。多個Cookie資訊透過一個Cookie請求頭字段回送給WEB伺服器。瀏覽器是否發送某個

Cookie訊息根據下面的幾個規則決定:

      1.請求的主機名稱是否與某個儲存的Cookie的Domain屬性相符

      2.請求的連接埠號碼是否在該Cookie的Port屬性清單中

      3.所要求的資源路徑是否在該Cookie的Path屬性指定的目錄及子目錄中

      4.此Cookie的有效期限是否已過Cookie請求頭字段中的每個Cookie之間用逗號(,)或分號(;)分

隔。 Cookie請求頭欄位中除了必須有"名稱=值"的設定外,還可以有Version、Path、Domain、Port

等幾個屬性。但是如果要設定Version、Path、Domain、Port等屬性時,需要在屬性名稱之前增加一個

"$"字元作為前綴,並且Version屬性只能出現一次,並且要位於Cookie請求頭字段設定值的最前面,

如果需要設定某個Cookie訊息的Path、Domain、Port等屬性,它們必須位於該Cookie資訊的"名稱=

值"設定之後。 Path屬性要注意的是該屬性指向子目錄的Cookie要排在Path屬性指向父目錄的

Cookie之前。例如:Cookie: $Version=1; Course=Java; $Path=/it315/lesson; Course=vc; 

$Path=/it315。該Cookie就符合上述約束。影片教學中示範了一個具體的實例:

代码一:
      Cookie ckName = new Cookie("name",name); 
      Cookie ckNickname = new Cookie("nickname",nickname); 
      ckNickname.setMaxAge(365*24*3600); 
      Cookie ckEmail = new Cookie("email","test1@it315.org"); 
      Cookie ckPhone = new Cookie("phone","1111111"); 
      response.addCookie(ckName); 
      response.addCookie(ckNickname); 
      response.addCookie(ckEmail); 
      response.addCookie(ckPhone);
代码二:
      String lastNickname = null; 
      Cookie [] cks = request.getCookies(); 
      for(int i=0; cks!=null && i<cks.length; i++) {
          if("nickname".equals(cks[i].getName())) {
              lastNickname = cks[i].getValue();
              break;  
          } 
      }  
      if(lastNickname != null) {
      out.println("欢迎您," + lastNickname );
      }

以上程式碼片段一是產生四個名稱分別為name、nickname、email、phone的Cookie資訊。 name和

nickname這兩個Cookie的值是透過請求參數來設定的,並且nickname這個Cookie保持有效的時間為1

年,email和phone這兩個cookie的值是在程式中硬編碼指定的。程式碼片段在二是在產生Cookie訊息

之後接著從請求訊息中找出名稱為nickname的Cookie訊息,並根據回傳結果列印出對應的問候語,

片段中也列印出請求訊息中的Cookie頭欄位的值。

  了解會話的概念和Cookie技術,接下來對Session做了詳細的介紹與範例示範。這段影片主要講解

了什麼是Session、Session的追蹤機制、Session的逾時管理、HttpSession介面中的方法、

HttpServletRequest介面中的Session方法、application與session域範圍的屬性比較、利用

Cookie實現Session追蹤、利用URL重寫實作Session追蹤。這些技術都是以後要常用來的。

    使用Cookie和附加UR​​L參數都可以將上一次請求的狀態資訊傳遞到下一次請求中,但是如果傳遞

的狀態資訊較多,將極大降低網路傳輸效率和增大伺服器端程式處理的難度,為了解決這個問題,

Session技術就產生了。 Session技術是一種將會話狀態保存在伺服器端的技術。在會話過程中,客

戶端需要接收、記憶和回送 Session的會話標識號,Session可以且通常是藉助Cookie來傳遞會話標

識號。就如看到的那樣,Cookie和Session往往是協同工作的,這樣就能解決Http協定無狀態的性質

。有了Session這個概念,就需要程式來實現,然後讓伺服器能夠成功追蹤具體的某一個Session。

在Servlet API規範中,定義了一個HttpSession接口,HttpSession接口定義了各種管理和操作會

話狀態的方法。 WEB伺服器產生的HttpSession物件是保持會話狀態資訊的儲存結構,一個客戶端在

WEB伺服器端對應一個各自的HttpSession物件。 WEB伺服器並不會在客戶端開始存取它時就創建

HttpSession對象,只有客戶端存取某個能與客戶端開啟會話的Servlet程式時,WEB應用程式才會創

#建立一個與該客戶端對應的HttpSession物件。 WEB伺服器為每個HttpSession物件指派一個獨一無二的

會話標識號,然後在回應訊息中將這個會話標識號傳遞給客戶端。客戶端需要記住會話標識號,並在

後續的每次存取請求中都把這個會話標識號傳送給WEB伺服器,WEB伺服器端程式依據回傳的會話標識

號就知道這次請求是哪個客戶端發出的,從而選擇與之對應的HttpSession物件。因為伺服器端的資

來源是有限的,不能無限制的保存HttpSession對象,所以WEB應用程式創建了與某個客戶端對應的

HttpSession对象后,只要没有超出一个限定的空闲时间段,HttpSession对象就驻留在WEB服务器内

存之中,该客户端此后访问任意的Servlet程序时,它们都使用与客户端对应的那个已存在的

HttpSession对象。HttpSession接口中专门定义了一个setAttribute方法来将对象存储到

HttpSession对象中,还定义了一个getAttribute方法来检索存储在HttpSession对象中的对象,存

储进HttpSession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。

    前面提到的服务器资源有限,WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无

法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之

对应的HttpSession对象。但是随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会

因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。因此WEB服务器

采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发

出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的

HttpSession对象变成垃圾。如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一

个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。虽然会有少数出现事

实上的同一会话,却产生两次HttpSession对象,但是相对于大量正常的访问请求,这种情况基本上

可以忽略了。在Servlet API中,会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容

器定义。

    例如:<session-config>
              <session-timeout>30</session-timeout>
          </session-config>

    下面拿出视频中的一个小例子来说明一下使用Session实现购物车:

      String courseSelect = request.getParameter("course");
      if(courseSelect != null){
          Vector vCourses = (Vector)session.getAttribute("courses");
          if(vCourses == null){
              vCourses = new Vector();
              vCourses.add(courseSelect);
              session.setAttribute("courses",vCourses);
          }
          else{
              if(vCourses.contains(courseSelect)){
                  out.println(sessionName + ",你以前选择过了" + 
                             courseSelect + "<hr>");
              }
              else{
                  vCourses.add(courseSelect);
              }
          }
      }

上面的代码首先判断访问请求是否来自一个已登录用户,如果不是,则将请求重定向到logon.html页

面。接着判断当前访问请求是否是用户选择课程时发出的,如果是,则将用户选择的课程加入购物车

。最后显示出所有供选择的课程列表和已放入购物车中的课程列表。

以上是傳智播客會話管理教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn