Spring MVC 入門指南(十三):獲取Cookie值
常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。
1. Cookie機制
在程式中,會話跟蹤是很重要的事情。理論上,一個使用者的所有請求操作都應該屬於同一個會話,而另一個使用者的所有請求操作則應該屬於另一個會話,二者不能混淆。例如,使用者A在超市購買的任何商品都應該放在A的購物車內,不論是使用者A什麼時間購買的,這都是屬於同一個會話的,不能放入使用者B或使用者C的購物車內,這不屬於同一個會話。
而Web應用程式是使用HTTP協議傳輸資料的。HTTP協議是無狀態的協議。一旦資料交換完畢,客戶端與伺服器端的連線就會關閉,再次交換資料需要建立新的連線。這就意味著伺服器無法從連線上跟蹤會話
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.測試執行
相關推薦
Spring MVC 入門指南(十三):獲取Cookie值
常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。1. Cookie機制在程式中,會話跟蹤是很重要的事情。理論上,一個使用者的所有請求操作都應該屬於同一個會話,而另一個使用者
Spring Boot / Spring MVC 入門實踐 (一) :環境搭建與第一個專案
宣告 本系列文章系本人原創,歡迎轉載,轉載請註明出處。 本系列文章通過具體的例子,介紹如何通過Spring Boot來幫助簡化Spring MVC開發Web Application的過程,旨在通過具體的實踐,使讀者能夠入門利用Spring Boot開發Web
Spring MVC 學習筆記(二):@RequestMapping用法詳解
一、@RequestMapping 簡介 在Spring MVC 中使用 @RequestMapping 來對映請求,也就是通過它來指定控制器可以處理哪些URL請求,相當於Servlet中在web.xml中配置 <servlet>
Spring MVC 使用介紹(十三)資料驗證
一、訊息處理功能 Spring提供MessageSource介面用於提供訊息處理功能: public interface MessageSource { String getMessage(String code, Object[] args, String defaultMessage,
Asp.Net MVC4入門指南(2):新增一個控制器
MVC代表: 模型-檢視-控制器 。MVC是一個架構良好並且易於測試和易於維護的開發模式。基於MVC模式的應用程式包含: · Models: 表示該應用程式的資料並使用驗證邏輯來強制實施業務規則的資料類。 · Views: 應用程式動態生成 HTML所使用的模板檔案。 · Controllers: 處理
Asp.Net MVC4入門指南(6):驗證編輯方法和編輯檢視
在本節中,您將開始修改為電影控制器所新加的操作方法和檢視。然後,您將新增一個自定義的搜尋頁。 在瀏覽器位址列裡追加/Movies, 瀏覽到Movies頁面。並進入編輯(Edit)頁面。 Edit(編輯)連結是由Views\Movies\Index.cshtml檢視中的Html.ActionLink方法
Asp.Net MVC4入門指南(7):給電影表和模型新增新欄位
在本節中,您將使用Entity Framework Code First來實現模型類上的操作。從而使得這些操作和變更,可以應用到資料庫中。 預設情況下,就像您在之前的教程中所作的那樣,使用 Entity Framework Code First自動建立一個數據庫,Code First為資料庫所新增的表,將幫
Asp.Net MVC4入門指南(4):新增一個模型
在本節中,您將新增一些類,這些類用於管理資料庫中的電影。這些類是ASP.NET MVC 應用程式中的"模型(Model)"。 您將使用.NET Framework 資料訪問技術Entity Framework,來定義和使用這些模型類。Entity Framework(通常稱為 EF) 是支援程式碼優先的開發
Asp.Net MVC4入門指南(8):給資料模型新增校驗器
在本節中將會給Movie模型新增驗證邏輯。並且確保這些驗證規則在使用者建立或編輯電影時被執行。 保持事情 DRY ASP.NET MVC 的核心設計信條之一是DRY: "不要重複自己(Don’t Repeat Yourself)"。ASP.NET MVC鼓勵您指定功能或者行為,只做一次,然後將它應用到應用
Asp.Net MVC4入門指南(3):新增一個檢視
在本節中,您需要修改HelloWorldController類,從而使用檢視模板檔案,乾淨優雅的封裝生成返回到客戶端瀏覽器HTML的過程。 您將建立一個檢視模板檔案,其中使用了ASP.NET MVC 3所引入的Razor檢視引擎。Razor檢視模板檔案使用.cshtml副檔名,並提供了一個優雅的方式來使用C
Asp.Net MVC4入門指南(9):查詢詳細資訊和刪除記錄
在本教程中,您將檢視自動生成的Details和Delete方法。 查詢詳細資訊和刪除記錄 開啟Movie控制器並檢視Details方法。 public ActionResult Details(int id = 0) { Movie movie = db.Movies.Find(id);
Asp.Net MVC4入門指南(5):從控制器訪問資料模型
在本節中,您將建立一個新的MoviesController類,並在這個Controller類裡編寫程式碼來取得電影資料,並使用檢視模板將資料展示在瀏覽器裡。 在開始下一步前,先Build一下應用程式(生成應用程式)(確保應用程式編譯沒有問題) 用滑鼠右鍵單擊Controller資料夾,並建立一個新的
Asp.Net MVC4入門指南(10):第三方控制元件Studio for ASP.NET MVC4 工具應用
ComponentOne Studio for ASP.NET最新版本2013V1支援MVC4,其中包括: 新增 MVC 4 工程模板 (C# & VB) 開箱即用的MVC 4 工程模板基於Microsoft內建模板建立,我們僅優化了標記和CSS樣式為預設風格,熟悉的模板佈局和介面風格,無疑將縮
Asp.Net MVC4入門指南(1): 入門介紹
前言 本教程將為您講解使用微軟的Visual Studio Express 2012或Visual Web Developer 2010 Express Service Pack 1 來建立一個ASP.NET MVC4 Web應用程式所需要的基礎知識。建議您使用Visual Studio 2012,你將不再
Backbone入門指南(六):View (檢視)
9. View (檢視控制器) 我們在前面的章節中介紹了Model和Collection,它們都是用於資料管理和互動,在本章我們討論如何使用檢視(View)將這些資料渲染到介面,以及如何管理介
dotConnect for Oracle入門指南(一):安裝
【下載dotConnect for Oracle最新版本】 dotConnect for Oracle(原名OraDirect.NET)建立在ADO.NET技術上,為基於Oracle資料庫的應用程式提供完整的解決方案。它為設計應用程式結構帶來了新的方法,提高工作效率,使資料庫應用程式的開發更簡便。 d
Backbone入門指南(三):Events(事件管理)
6. Events (事件管理) 從這一章開始,我將正式介紹Backbone的內容,過程中會有許多例子和程式碼,你應該將這些程式碼複製到你的頁面,並檢視它們的執行效果。 我介紹的第一個模組是Ba
Cortex-M3 入門指南(三):時鐘總線與復位時鐘控制器
關系 有著 寄存器 系統時鐘 實時時鐘 參數 www 開發 正整數 【reset clock control 復位和時鐘控制器】 時鐘信號對於處理器非常重要,比如我們熟悉的 CPU 就是由時鐘信號驅動的,而主頻就是內核的的時鐘信號頻率。Cortex-M3 有著復雜
條形碼入門指南(八):二維條形碼
現在條形碼無處不在,幾乎用於所有業務領域的識別。在業務流程中實施條形碼時,可以自動執行程式以減少人為錯誤
Spring Boot入門系列(十三)如何實現事務
前面介紹了Spring Boot 中的整合Mybatis並實現增刪改查。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。 Spring Boot 整合完Mybatis,有個特別重要的功能之前忘記講了:那就是