會話技術(Cookie和Session)
什麼是會話呢?
所謂的會話過程就是指從開啟瀏覽器到關閉瀏覽器的過程。
Cookie和Session指的又是什麼呢?
大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都開啟新的會話,而且伺服器也不會自動維護客戶的上下文資訊。如果說我們要實現購物車新增或刪除商品的功能的話,我們就需要使用到Cookie和Session技術。也就是說,Cookie和Session是域物件。所謂域就相當於給儲存的內容設定一個邊界,將儲存的內容儲存到這片區域內。
什麼是HttpServletResponse轉發和重定向?
因為將下面的域物件的時候會用到轉發和重定向的知識點,所以在此補充一下.......
①.轉發:轉發時瀏覽器位址列不會發生改變。
轉發時瀏覽器傳送了一次請求。
轉發時發生在伺服器內部,瀏覽器不知道轉發的發生。
RequestDispatcher rd = request.getRequestDispatcher("轉發到的頁面");
rd.forward(request, response);
②.重定向:重定向時位址列發生改變。
重定向時瀏覽器傳送了兩次請求。
重定向時發生在瀏覽器端的,瀏覽器知道重定向的發生。
response.sendRedirect("重定向到的頁面");
Request域、ServletContext域、pageContext域、Cookie域、Session域的區別是什麼?
用在網上購買東西這個案例來剖析這個問題。
①.request域:表示的是一次請求範圍內。
如果說,我要去購買一件上衣向伺服器傳送一個購買請求,它返回給我一個購買成功的響應;當我再去購買一個褲子的時候就相當於又一個請求,那麼這時候用轉發的話當然就不行了,如果用重定向的話可以解決這個問題,只不過比較麻煩。然後把裡面所購買的上衣的資料從request域拿出來和第二個請求拼接在一起在存入request域中。
但是當我要去結算的,就是在另一個Servlet中,這個時候我的request域中的資料就會全部丟失。具體如下圖所示:
②.ServletContext域和pageContext域:
這兩個域在我看來沒有本質上的區別,可以理解為伺服器端的共享空間。只不過說,ServletContext域表示的是整個web服務,而pageContext域表示的是一次請求。
如果說,我要購買一件上衣,向伺服器傳送一個請求,伺服器返回給我一個購買成功的請求 ,同樣的再去購買一條褲子也是一樣的。看來一切都是正常的,結算也可以去結算介面結算我的總金額。
但是,我要說的是,因為這是一個購物介面,所以就不會只是你一個使用者。因為這是一個伺服器端的共享空間,所以當別人也去購買東西新增購物車後,你去結算的時候就包括自己和別人共同的東西。具體如下圖所示:
③.Cookie域:
Cookie域就是所謂的會話技術,或者說是客戶端技術。
同樣去買一件上衣,這個時候就會把上衣這個物件存入的開闢的Cookie空間中, Cookie空間為此物件繫結一個唯一的標識然後以響應頭方式返回給客戶端,當再去購買褲子的時候會帶著這個唯一標識以請求頭的方式存入到Cookie空間中,同時為它繫結唯一的標識。因為Cookie域儲存在自己瀏覽器內部,與別人互不干擾,但因為是客戶端技術,所以安全性不高。具體如下圖所示:
④.Session域
Session域就是另一種會話技術,也叫做伺服器端技術。Session的底層也是基於Cookie的,只不過有自己的改變。
和Cookie一樣,去買一件上衣,這個時候就會把上衣這個物件存入的開闢的Session空間中, Session空間為此物件生成一個唯一的Key值,當再去購買褲子的時候會帶著這個唯一的Key值存入到Cookie空間中,同時為它繫結唯一的Key值。因為Session域同樣儲存在自己瀏覽器內部,與別人互不干擾,它相較於Cookie而言是伺服器技術,較安全。具體如下圖所示:
Cookie域的常用方法:
1.獲取Cookie的內容:
Cookie[] cookies = request.getCookies();
因為如果我們開啟京東的同時,同時去開啟淘寶等,這個時候就會存在多個Cookie
2.Cookie的構造方法:Cookie(String name,String value)
3.獲取Cookie的值:String getValue()
4.獲取Cookie的名稱:String getName()
5.設定有效的時間:void SetMaxAge(int expiry)
①.會話級別的Cookie:預設一個會話的時間,預設儲存在瀏覽器記憶體中
②.持久的Cookie:把Cookie儲存到磁碟上,通過(5.)設定。eg:儲存使用者名稱,QQ...等
SetMaxAge(0):提前將Cookie結束
前提條件:有效路徑必須相同,從別的Servlet停止,首先要設定同一路徑。
6.設定有效路徑: void SetPath(String url)
7.設定有效域名:void SetDomain(String patten)
eg:我要登入百度,那麼:www.baidu.com
登入百度書城:book.baidu.com
SetDomain(".baidu.com");
Session域的常用方法:
1. 如何獲得session物件
HttpSession session =request.getSession();
2. 如何存取資料
String age = (String)session.getAttribute("age");
//getAttribute(String name)
//通過Session來存入內容,然後來獲取這指定的值,或新增指定的值
session.setAttribute("age","20");
session.removeAttribute(“age”);
3.String getId() 獲取Session的唯一id
4.void invalidate() 銷燬Session
就先簡單介紹到這裡....