課程介紹:
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伺服器本身不能識別出哪些請求是同一個瀏覽器發出頭字段。 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和附加URL參數都可以將上一次請求的狀態資訊傳遞到下一次請求中,但是如果傳遞
的狀態資訊較多,將極大降低網路傳輸效率和增大伺服器端程式處理的難度,為了解決這個問題,
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中文網其他相關文章!