Servlet技術 - Cookie與Session

#Cookie與Session ##會話使用web

  • 使用場景瀏覽器

    • 偏好記錄
    • 自動登陸
    • 瀏覽記錄
  • 原理安全

    • 客戶端或者服務端保存用戶數據

##Cookie與Session服務器

  • Cookie
    會話數據保存在瀏覽器客戶端
  • Session 會話數據保存在服務端

#Cookie ##Cookie定義 某些網站爲了辨別用戶身份,存儲在用戶本地終端上的數據cookie

  • 會話數據
  • 保存在客戶端
  • Key-Value形式數據

##Cookie工做流程 ###第一次訪問session

  • 1 客戶端瀏覽器向服務器發送HTTP請求
  • 2 服務器根據須要生成cookie對象,並把一些數據保存在該cookie對象中
  • 3 服務器會把cookie對象放在http響應頭中
  • 4 服務器發送HTTP響應給瀏覽器
  • 5 瀏覽器接收到HTTP響應,提出該cookie保存在瀏覽器端

###再次訪問post

  • 1 客戶端瀏覽器向服務器發送HTTP求取帶有cookie對象
  • 2 服務器根據獲取的cookie對象生成HTTP響應

輸入圖片說明

##Cookie生命週期網站

  • 默認會話結束後失效
    只要關閉瀏覽器窗口,Cookie就消失了。這種咱們叫作會話Cookie,會話Cookie咱們會保存在內存中,而不是硬盤上。
  • setMaxAge設置cookie有效期
    若是設置了Cookie的有效時間,則瀏覽器會把cookie保存在硬盤上。咱們關閉瀏覽器再次打開,這個Cookie依然有效,直到超過過時時間。

##Cookie的缺陷加密

  • 大小和數量限制
    通常來講每一個站點可以保存20個Cookie,每一個Cookie通常限制在4K之內。
  • 數據安全性
    因爲HTTP數據內容傳送是明文傳送,則有安全風險

##Cookie實例 請求頁面code

<form method="post" action="user/specify">
        <p><input type="text" name="userName" value="" placeholder="username"></p>
        <p><input type="password" name="userPassword" value="" placeholder="password"></p>
        <p class="submit"><input type="submit" name="commit" value="submit"></p>
      </form>

UserServlet
注意:咱們在response對象中設置Cookie,示例中代碼問題,咱們應當先判斷request是否有Cookie,在給response添加cookie內容。

//Cookie初始化
Cookie userNameCookie = new Cookie("userName", userName);
		Cookie pwdCookie = new Cookie("pwd", userPassword);
                //過時時間
		userNameCookie.setMaxAge(10 * 60);
		pwdCookie.setMaxAge(10 * 60);

		response.addCookie(userNameCookie);
		response.addCookie(pwdCookie);

		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				if (cookie.getName().equals("userName")) {
					userName = cookie.getValue();
				}
				if (cookie.getName().equals("pwd")) {
					userPassword = cookie.getValue();
				}
			}
		}

咱們在第一次請求輸入用戶名密碼,關閉瀏覽器再次打開頁面,並無輸入用戶名密碼,也可以看到用戶名密碼信息內容。這是由於咱們在第一次請求時建立了Cookie對象,在第二次請求的時候,瀏覽器把Cookie發送給了服務器,服務器知道是這個用戶,實現自動登陸。
經過Chrome查看Cookie對象
輸入圖片說明
輸入圖片說明

#Session ##Session特色

  • 保存在服務端

  • HttpSession
    用來保存用戶的一些數據內容

  • 狀態保存 ##Session工做原理

  • 1 瀏覽器發送HTTP請求到服務器端

  • 2 服務端會根據服務器請求,生成對應的Session對象,並給這個Session對象附上惟一的編號,服務器端把須要的數據記錄到Session對象

  • 3 服務器端進行其餘邏輯處理,而後把Session的惟一編號放到Cookie中

  • 4 服務器返回HTTP響應給瀏覽器

  • 5 瀏覽器端會把帶有這個Session ID的Cookie記錄在瀏覽器本地

  • 當下一次瀏覽器發送HTTP請求時,會把帶有Session ID的Cookie發送給服務器

  • 服務器獲取帶有Session ID的Cookie,取出對應的Session ID,根據Session ID找到對應的Session對象

  • 當服務器辨別用戶以後,進行HTTP響應

##Session生命週期

  • 默認有效期30分鐘
  • setMaxInactiveInterval設置有效期
  • 部署描述符配置Session有效期
  • 與Cookie不一樣的是,咱們能夠主動調用invalidate接口使用Session失效

###Session生命週期設置優先級 經過setMaxInactiveInterval接口設置有效期的優先級大於經過部署描述符配置的Session有效期

##Session實例 ###Session實例演示 在Servlet

HttpSession session = request.getSession();
                session.setAttribute("username",userName);
		String name = (String) session.getAttribute("userName");

再次登陸能夠在輸出打印到

second login: 123

打開Chrome開發者界面,查看SessionID

輸入圖片說明

###Session過時 ####設置Session過時時間

//設置當前會話的失效時間,不是web服務。單位秒
		session.setMaxInactiveInterval(1000);

####主動Session失效

session.invalidate();

##經過部署描述符(web.xml)設置session過時時間 web.xml

<session-config>
		<session-timeout>5</session-timeout>
	</session-config>

這裏配置的是分鐘

#Cookie&Session總結

  • 數據存儲
    Cookie是存放在客戶端,Session存放在服務器
  • 安全性
    Cookie是存放在客戶端安全較弱,但能夠經過加密的形式進行存放。,Session存放在服務器內存,安全較強
  • 生命週期
    Cookie是存放在客戶端,Session是間隔時間,以最後一次訪問爲主,能夠直接使用API失效
  • 使用原則 Cookie是存放在客戶端,一個站點有20個之內數量限制。,Session存放在服務器內存,不建議存放大對象
相關文章
相關標籤/搜索