1. 程式人生 > >會話技術(Cookie和Session)

會話技術(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

  就先簡單介紹到這裡....