Spring MVC 入門指南(十三):獲取Cookie值
常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。
1. Cookie機制
在程式中,會話跟蹤是很重要的事情。理論上,一個使用者的所有請求操作都應該屬於同一個會話,而另一個使用者的所有請求操作則應該屬於另一個會話,二者不能混淆。例如,使用者A在超市購買的任何商品都應該放在A的購物車內,不論是使用者A什麼時間購買的,這都是屬於同一個會話的,不能放入使用者B或使用者C的購物車內,這不屬於同一個會話。
而Web應用程式是使用HTTP協議傳輸資料的。HTTP協議是無狀態的協議。一旦資料交換完畢,客戶端與伺服器端的連線就會關閉,再次交換資料需要建立新的連線。這就意味著伺服器無法從連線上跟蹤會話。即使用者A購買了一件商品放入購物車內,當再次購買商品時伺服器已經無法判斷該購買行為是屬於使用者A的會話還是使用者B的會話了。要跟蹤該會話,必須引入一種機制。
Cookie就是這樣的一種機制。它可以彌補HTTP協議無狀態的不足。在Session出現之前,基本上所有的網站都採用Cookie來跟蹤會話。
2. 什麼是Cookie
Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社群發展的一種機制。目前Cookie已經成為標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支援Cookie。
由於HTTP是一種無狀態的協議,伺服器單從網路連線上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
3.設定Cookie的所有屬性
Cookie常用屬性
屬性名 | 描 述 |
String name | 該Cookie的名稱。Cookie一旦建立,名稱便不可更改 |
Object value | 該Cookie的值。如果值為Unicode字元,需要為字元編碼。如果值為二進位制資料,則需要使用BASE64編碼 |
int maxAge | 該Cookie失效的時間,單位秒。如果為正數,則該Cookie在maxAge秒之後失效。如果為負數,該Cookie為臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式儲存該Cookie。如果為0,表示刪除該Cookie。預設為–1 |
boolean secure | 該Cookie是否僅被使用安全協議傳輸。安全協議。安全協議有HTTPS,SSL等,在網路上傳輸資料之前先將資料加密。預設為false |
String path | 該Cookie的使用路徑。如果設定為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程式可以訪問該Cookie。如果設定為“/”,則本域名下contextPath都可以訪問該Cookie。注意最後一個字元必須為“/” |
String domain | 可以訪問該Cookie的域名。如果設定為“.google.com”,則所有以“google.com”結尾的域名都可以訪問該Cookie。注意第一個字元必須為“.” |
String comment | 該Cookie的用處說明。瀏覽器顯示Cookie資訊的時候顯示該說明 |
int version | 該Cookie使用的版本號。0表示遵循Netscape的Cookie規範,1表示遵循W3C的RFC 2109規範 |
4.Cookie的有效期
Cookie的maxAge決定著Cookie的有效期,單位為秒(Second)。Cookie中通過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。
如果maxAge屬性為正數,則表示該Cookie會在maxAge秒之後自動失效。瀏覽器會將maxAge為正數的Cookie持久化,即寫到對應的Cookie檔案中。無論客戶關閉了瀏覽器還是電腦,只要還在maxAge秒之前,登入網站時該Cookie仍然有效。下面程式碼中的Cookie資訊將永遠有效。
5.Cookie的修改、刪除
Cookie並不提供修改、刪除操作。如果要修改某個Cookie,只需要新建一個同名的Cookie,新增到response中覆蓋原來的Cookie。
如果要刪除某個Cookie,只需要新建一個同名的Cookie,並將maxAge設定為0,並新增到response中覆蓋原來的Cookie。注意是0而不是負數。負數代表其他的意義。讀者可以通過上例的程式進行驗證,設定不同的屬性。
注意:修改、刪除Cookie時,新建的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣。否則,瀏覽器將視為兩個不同的Cookie不予覆蓋,導致修改、刪除失敗。
6.Cookie的安全屬性
HTTP協議不僅是無狀態的,而且是不安全的。使用HTTP協議的資料不經過任何加密就直接在網路上傳播,有被截獲的可能。使用HTTP協議傳輸很機密的內容是一種隱患。如果不希望Cookie在HTTP等非安全協議中傳輸,可以設定Cookie的secure屬性為true。瀏覽器只會在HTTPS和SSL等安全協議中傳輸此類Cookie。下面的程式碼設定secure屬性為true:
Cookie cookie = new Cookie("time", "20080808"); // 新建Cookie
cookie.setSecure(true); // 設定安全屬性
response.addCookie(cookie); // 輸出到客戶端
提示:secure屬性並不能對Cookie內容加密,因而不能保證絕對的安全性。如果需要高安全性,需要在程式中對Cookie內容加密、解密,以防洩密。
7.案例--獲取Cookie值
1.LoginController.java
/**
* @author Ray
* @date 2018/4/26 0026
*/
@Controller
@RequestMapping(value = "login")
public class LoginController {
@RequestMapping(value = "doLogin")
public String login(){
return "login";
}
@RequestMapping(value = "checkCookie")
public String checkCookie(String username, String password, HttpServletResponse response){
// 新建Cookie
Cookie username_cookie = new Cookie("username", username);
Cookie password_cookie = new Cookie("password", password);
// 輸出到客戶端
response.addCookie(username_cookie);
response.addCookie(password_cookie);
return "redirect:getCookie";
}
@RequestMapping(value = "getCookie")
public String getCookie(@CookieValue("username") String username, @CookieValue("password") String password){
// 控制檯輸出
System.out.println("username: " + username);
System.out.println("password: " + password);
return "success";
}
}
2.login.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登陸介面</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<form action="login/checkCookie" method="post">
<table>
<th>登陸介面</th>
<tr>
<td>姓名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="text" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="登入"></td>
</tr>
</table>
</form>
</body>
</html>
3.success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Cookie</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<h2>獲取Cookie</h2>
username_cookie:${cookie.username.value}<br>
password_cookie:${cookie.password.value}
</body>
</html>
4.測試執行
相關文章
- 獲取cookie裡面的值Cookie
- spring mvc 快速入門SpringMVC
- Spring MVC 入門程式SpringMVC
- spring mvc中獲取請求URLSpringMVC
- Spring入門指南Spring
- playwright自動登入獲取cookie/ckCookie
- 抖音 App 登入分析,Cookie 獲取APPCookie
- HttpServletRequest 獲取 CookieHTTPServletCookie
- gatling 獲取 cookieCookie
- 捕獲cookie的值Cookie
- 如何獲取Cookie並使用Cookie侵入Cookie
- 獲取cookie辦法Cookie
- request 獲取不到 CookieCookie
- Python Cookie HTTP獲取cookie並處理PythonCookieHTTP
- requests模組獲取cookieCookie
- java後臺獲取cookieJavaCookie
- Spring 呼叫 Stored Procedure 並獲取返回值Spring
- Python Flask,cookie,設定、獲取、刪除cookiePythonFlaskCookie
- java 獲取傳入值的區間Java
- 獲取input框輸入值異常
- Python教程分享:Python Cookie HTTP獲取cookie並處理PythonCookieHTTP
- ASP.NET Core 入門教程 5、ASP.NET Core MVC 檢視傳值入門ASP.NETMVC
- Asp.Net MVC控制器獲取檢視傳值幾種方式ASP.NETMVC
- Spring入門學習手冊 6:Spring MVC基礎中的基礎SpringMVC
- Spring入門學習手冊 5:Spring MVC的一個Hello world!例子SpringMVC
- Cookie新增、獲取以及刪除操作Cookie
- Vue入門指南-08 Vue中的標籤/如何獲取DOM元素(快速上手vue)Vue
- jQuery獲取各種input輸入框的值jQuery
- Spring Boot EL獲取配置檔案中的值的方式Spring Boot
- cookie的設定、獲取和刪除Cookie
- JavaScript 寫入與讀取cookieJavaScriptCookie
- java spring mvc jsp excel 匯入JavaSpringMVCJSExcel
- Python培訓技術分享:Python Cookie HTTP獲取cookie並處理PythonCookieHTTP
- JavaScript獲取css的值JavaScriptCSS
- 使用requests獲取並向headers中新增cookieHeaderCookie
- Markdown入門指南
- MySQL 入門指南MySql
- Zookeeper入門指南