1. 程式人生 > >Servlet cookie和session的簡介和作用

Servlet cookie和session的簡介和作用

接下來博主將會為大家介紹javaweb中的session和cookie,在最後還會提供幾種session或者cookie的應用場景,以及應用的思路

先上總結,然後下面是細緻地解析喔~

總結

  • Cookie

    伺服器給客戶端傳送一小份資料, 存放在客戶端上。

    基本用法:

      新增cookie
    
      獲取cookie。
    

    演練例子:

      1. 獲取上一次訪問時間
    
      2. 獲取商品瀏覽記錄。
    
  • 什麼時候有cookie

    response.addCookie(new Cookie())

  • Cookie 分類

      會話Cookie
    
      	關閉瀏覽器,就失效
    
      持久cookie
    
      	存放在客戶端上。 在指定的期限內有效。 
    
      	setMaxAge();
    
  • Session

      也是基於cookie的一種會話技術,  資料存放存放在伺服器端
    
      會在cookie裡面新增一個欄位 JSESSIONID . 是tomcat伺服器生成。 
    
      setAttribute 存資料
    
      getAttribute 取資料
    
      removeAttribute  移除資料
    
      getSessionId();  獲取會話id
    
      invalidate() 強制讓會話失效。
    
  • 建立和銷燬

    ,呼叫request.getSesion建立

    伺服器關閉 , 會話超時(30分)

setAttribute 存放的值, 在瀏覽器關閉後,還有沒有。 有!,就算客戶端把電腦砸了也還有。

前言

對於cookie和session中,他們是在會話中發生作用的

什麼是會話

也就相當於打電話,兩個人能夠互相通話

會話過程中要解決什麼問題

保持各個客戶端自己的資料。

Cookie

由於Cookie資料是由客戶端來儲存和攜帶的,所以稱之為客戶端技術。

在這裡插入圖片描述

簡介

  • Cookie

餅乾. 其實是一份小資料, 是伺服器給客戶端,並且儲存在客戶端上的一份小資料

  • 應用場景

自動登入、瀏覽記錄、購物車。

  • 為什麼要有這個Cookie

http的請求是無狀態。 客戶端與伺服器在通訊的時候,是無狀態的,其實就是客戶端在第二次來訪的時候,伺服器根本就不知道這個客戶端以前有沒有來訪問過。 為了更好的使用者體驗,更好的互動 [自動登入],其實從公司層面講,就是為了更好的收集使用者習慣[大資料]

在這裡插入圖片描述

1、屬性:

 name:名稱不能唯一確定一個Cookie。路徑可能不同。
 value:不能存中文。
 path:預設值是寫Cookie的那個程式的訪問路徑
 比如:http://localhost:8080/day10_00_cookie/servlet/ck1寫的Cookie
 path就是:/day10_00_cookie/servlet 看當前建立cookie的資源(servlet)檔案路徑
 客戶端在訪問伺服器另外資源時,根據訪問的路徑來決定是否帶著Cookie到伺服器
 當前訪問的路徑如果是以cookie的path開頭的路徑,瀏覽器就帶。否則不帶。

 maxAge:cookie的快取時間。預設是-1(預設存在瀏覽器的記憶體中)。單位是秒。
 負數:cookie的資料存在瀏覽器快取中
 0:刪除。路徑要保持一致,否則可能刪錯人。
 正數:快取(持久化到磁碟上)的時間

Cookie怎麼用

簡單使用:

  • 新增Cookie給客戶端

    1. 在響應的時候,新增cookie

       Cookie cookie = new Cookie("aa", "bb");
       
       
       //給響應,新增一個cookie
       response.addCookie(cookie);
      
    2. 客戶端收到的資訊裡面,響應頭中多了一個欄位 Set-Cookie

在這裡插入圖片描述

  • 獲取客戶端帶過來的Cookie

      //獲取客戶端帶過來的cookie
      Cookie[] cookies = request.getCookies();
      if(cookies != null){
      	for (Cookie c : cookies) {
      		String cookieName = c.getName();
      		String cookieValue = c.getValue();
      		System.out.println(cookieName + " = "+ cookieValue);
      	}
      }
    
  • 常用方法

      //關閉瀏覽器後,cookie就沒有了。 ---> 針對沒有設定cookie的有效期。
      //	expiry: 有效 以秒計算。
      //正值 : 表示 在這個數字過後,cookie將會失效。
      //負值: 關閉瀏覽器,那麼cookie就失效, 預設值是 -1
      cookie.setMaxAge(60 * 60 * 24 * 7);
      
      //賦值新的值
      //cookie.setValue(newValue);
      
      //用於指定只有請求了指定的域名,才會帶上該cookie
      cookie.setDomain(".itheima.com");
      
      //只有訪問該域名下的cookieDemo的這個路徑地址才會帶cookie
      cookie.setPath("/CookieDemo");
    

例子一 顯示最近訪問的時間。

  1. 判斷賬號是否正確

  2. 如果正確,則獲取cookie。 但是得到的cookie是一個數組, 我們要從數組裡面找到我們想要的物件。

  3. 如果找到的物件為空,表明是第一次登入。那麼要新增cookie

  4. 如果找到的物件不為空, 表明不是第一次登入。

     if("admin".equals(userName) && "123".equals(password)){
     	//獲取cookie last-name --- >
     	Cookie [] cookies = request.getCookies();
     	
     	//從數組裡面找出我們想要的cookie
     	Cookie cookie = CookieUtil.findCookie(cookies, "last");
     	
     	//是第一次登入,沒有cookie
     	if(cookie == null){
     		
     		Cookie c = new Cookie("last", System.currentTimeMillis()+"");
     		c.setMaxAge(60*60); //一個小時
     		response.addCookie(c);
     		
     		response.getWriter().write("歡迎您, "+userName);
     		
     	}else{
     		//1. 去以前的cookie第二次登入,有cookie
     		long lastVisitTime = Long.parseLong(cookie.getValue());
     		
     		//2. 輸出到介面,
     		response.getWriter().write("歡迎您, "+userName +",上次來訪時間是:"+new Date(lastVisitTime));
     		
     		
     		//3. 重置登入的時間
     		cookie.setValue(System.currentTimeMillis()+"");
     		response.addCookie(cookie);
     	}
     }else{
     	response.getWriter().write("登陸失敗 ");
     }
    

例子二: 顯示商品瀏覽記錄。

準備工作

  1. 拷貝基礎課第一天的 htmll原型檔案,到工程的WebContent裡面。

  2. 在WebContent目錄下新建一個jsp檔案, product_list.jsp, 然後拷貝原來product_list.html的內容到jsp裡面。 建好之後,jsp裡面的所有ISO-8859-1 改成 UTF-8

    拷貝html標籤的所有內容。 替換jsp的html標籤即可

  3. 修改product_info.htm裡面的手機數碼超連結地址

     <li class="active"><a href="product_list.jsp">手機數碼<span class="sr-only">(current)</span></a></li>
    
  4. 修改首頁(index.html)頂部的手機數碼跳轉的位置為 product_list.jsp

     <li class="active"><a href="product_list.jsp">手機數碼<span class="sr-only">(current)</span></a></li>
    

分析

在這裡插入圖片描述

Jsp 裡面使用Java程式碼

  • jsp

Java Server Pager —> 最終會翻譯成一個類, 就是一個Servlet

  • 定義全域性變數

    <%! int a = 99; %>

  • 定義區域性變數

    <% int b = 999; %>

  • 在jsp頁面上,顯示 a 和 b的值,

    <%=a %>
    <%=b %>

jsp顯示瀏覽記錄

在這裡插入圖片描述

清除瀏覽記錄

其實就是清除Cookie, 刪除cookie是沒有什麼delete方法的。只有設定maxAge 為0 。

	Cookie cookie = new Cookie("history","");
	cookie.setMaxAge(0); //設定立即刪除
	cookie.setPath("/CookieDemo02");
	response.addCookie(cookie);

Cookie總結

  1. 伺服器給客戶端傳送過來的一小份資料,並且存放在客戶端上。

  2. 獲取cookie, 新增cookie

    request.getCookie();

    response.addCookie();

  3. Cookie分類

    會話Cookie
    預設情況下,關閉了瀏覽器,那麼cookie就會消失。

    持久Cookie

     在一定時間內,都有效,並且會儲存在客戶端上。 
    
     cookie.setMaxAge(0); //設定立即刪除
    
     cookie.setMaxAge(100); //100 秒
    
  4. Cookie的安全問題。

由於Cookie會儲存在客戶端上,所以有安全隱患問題。 還有一個問題, Cookie的大小與個數有限制。 為了解決這個問題 —> Session .

客戶端禁用Cookie後的會話資料儲存問題

客戶端禁用cookie:瀏覽器永遠不會向伺服器傳送cookie的請求訊息頭

解決方案:
方案一:在主頁上給出提示:請不要禁用您的cookie
方案二:URL重寫。必須對網站的所有地址都重寫。

http://url—>http://url;JSESSIONID=111
response.encodeURL(String url);
看瀏覽器有沒有傳送cookie請求訊息頭,沒有就重寫URL,有就不重寫。
request.getSession();必須寫

當然,如果希望簡單快捷地使用cookie ,可以瞭解下cookie.jar喔~

HttpSession

簡介

Session

會話 , Session是基於Cookie的一種會話機制。 Cookie是伺服器返回一小份資料給客戶端,並且存放在客戶端上。 Session是,資料存放在伺服器端。

  • 常用API

      //得到會話ID
      String id = session.getId();
      
      //存值
      session.setAttribute(name, value);
      
      //取值
      session.getAttribute(name);
      
      //移除值
      session.removeAttribute(name);
    
  • Session何時建立 , 何時銷燬?

  • 建立

如果有在servlet裡面呼叫了 request.getSession()

  • 銷燬

session 是存放在伺服器的記憶體中的一份資料。 當然可以持久化. Redis . 即使關了瀏覽器,session也不會銷燬。
關閉伺服器
session會話時間過期。 有效期過了,預設有效期: 30分鐘。

  • 1、為什麼要學HttpSession?

它也是一個域物件: session servletContext request
同一個會話下,可以使一個應用的多個資源共享資料
cookie客戶端技術,只能存字串。HttpSession伺服器端的技術,它可以存物件。

  • 2、常用方法

把資料儲存在HttpSession物件中,該物件也是一個域物件。
void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name);
HttpSession.getId():
setMaxInactiveInterval(int interval) 設定session的存活時間
invalidate() 使此會話無效

3、getSession():內部執行原理
HttpSession request.getSession():內部執行原理

  • 1、獲取名稱為JSESSIONID的cookie的值。

  • 2、沒有這樣的cookie,建立一個新的HttpSession物件,分配一個唯一的SessionID,並且向客戶端寫了一個名字為JSESSIONID=sessionID的cookie

  • 3、有這樣的Cookie,獲取cookie的值(即HttpSession物件的值),從伺服器的記憶體中根據ID找那個HttpSession物件:
    找到了:取出繼續為你服務。
    找不到:從2開始。

  • HttpSession request.getSession(boolean create):

引數:
true:和getSession()功能一樣。
false:根據客戶端JSESSIONID的cookie的值,找對應的HttpSession物件,找不到返回null(不會建立新的,只是查詢)。

session的狀態圖

在這裡插入圖片描述

例子三: 簡單購物車。

在這裡插入圖片描述

CartServlet 程式碼

	response.setContentType("text/html;charset=utf-8");
		
		//1. 獲取要新增到購物車的商品id
		int id = Integer.parseInt(request.getParameter("id")); // 0 - 1- 2 -3 -4 
		String [] names = {"Iphone7","小米6","三星Note8","魅族7" , "華為9"};
		//取到id對應的商品名稱
		String name = names[id];
		
		//2. 獲取購物車存放東西的session  Map<String , Integer>  iphoen7 3
		//把一個map物件存放到session裡面去,並且保證只存一次。 
		Map<String, Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");
		//session裡面沒有存放過任何東西。
		if(map == null){
			map = new LinkedHashMap<String , Integer>();
			request.getSession().setAttribute("cart", map);
		}
		
		
		//3. 判斷購物車裡面有沒有該商品
		if(map.containsKey(name)){
			//在原來的值基礎上  + 1 
			map.put(name, map.get(name) + 1 );
		}else{
			//沒有購買過該商品,當前數量為1 。
			map.put(name, 1);
		}
		
		//4. 輸出介面。(跳轉)
		response.getWriter().write("<a href='product_list.jsp'><h3>繼續購物</h3></a><br>");
		response.getWriter().write("<a href='cart.jsp'><h3>去購物車結算</h3></a>");

移除Session中的元素

	//強制幹掉會話,裡面存放的任何資料就都沒有了。
	session.invalidate();
	
	//從session中移除某一個數據
	//session.removeAttribute("cart");

其他例子

提供其他cookie session應用場景下面的思路分析給大家參考:

記住使用者功能思路分析

在這裡插入圖片描述

登入和驗證碼功能分析

在這裡插入圖片描述

歷史商品記錄功能分析

在這裡插入圖片描述

購物車功能分析

在這裡插入圖片描述

喜歡的朋友可以關注博主以及點贊評論喔,未來將會持續更新javaweb相關的內容。

您的支援是我更新最大的動力~