一、JSON 與參數傳遞
?
1.1JSON 是什么
?
- JSON 是字符串:比如 ?{"name":"zhangsan","password":"123456","age":15}? 就是一個 JSON 字符串,它用來在前后端、服務間傳遞數據。
- JSON 庫:Fastjson、Gson 這些庫能把 JSON 字符串轉成 Java 對象,也能把 Java 對象轉成 JSON 字符串。
?
1.2傳遞 JSON vs 傳遞對象
?
- 傳遞 JSON(@RequestBody):
- 請求示例:
- URL:?http://127.0.0.1:8080/request/9?
- 請求體:
{
? ? "name": "zhangsan",
? ? "password": "123456",
? ? "age": 15
}
?
- Controller 代碼:
@RequestMapping("/r9")
public String r9(@RequestBody Person person) {
? ? return "接收到參數 person: " + person;
}
?
?
- ?@RequestBody?:把請求體里的 JSON 字符串轉成 Person 對象。
- 傳遞對象(表單參數):
- 請求示例:
- URL:?http://127.0.0.1:8080/request/5?
- 請求參數:?name=zhangsan&password=123456&age=16?(表單格式)
- Controller 代碼:
@RequestMapping("/r5")
public String r5(Person person) {
? ? return "接收到參數 person: " + person;
}
?
?
- SpringMVC 會自動把表單參數轉成 Person 對象(參數名要和對象屬性名一致)。
?
1.3路徑參數(@PathVariable)
?
- 示例 URL:?https://www.toutiao.com/article/751018054333034562/?
- 這里的 ?751018054333034562? 就是路徑里的參數。
- Controller 代碼:
@RequestMapping("/r8/article/{id}")
public String r8(@PathVariable Integer articleId) {
? ? return "接收到參數 articleId: " + articleId;
}
?
@RequestMapping("/r11/article/{id}/{type}")
public String r11(@PathVariable("id") Integer id, @PathVariable String type) {
? ? return "接收到參數 id: " + id + ", type: " + type;
}
?
?
- ?@PathVariable?:從 URL 路徑中取參數,?@PathVariable("id")? 里的 ?"id"? 要和路徑里的 ?{id}? 對應。
?
1.4常用注解
?
- @RequestMapping:基礎注解,映射 URL 路徑,可指定請求方法(GET、POST 等)。
- @GetMapping、@PostMapping:分別是 ?@RequestMapping(method = RequestMethod.GET)? 和 ?@RequestMapping(method = RequestMethod.POST)? 的縮寫。
- @RequestParam:從請求參數中取參數(比如 ??name=zhangsan?),可指定是否必傳、默認值等。
- @RequestBody:接收請求體里的 JSON 數據,轉成 Java 對象。
- @RequestPart:上傳文件時用,接收 ?MultipartFile?。
- @PathVariable:從 URL 路徑中取參數。
- @RestController:組合注解,等于 ?@Controller + @ResponseBody?,方法返回值會轉成 JSON 或字符串返回給客戶端。
?
二、Cookie 與 Session
?
2.1無狀態 vs 有狀態
?
- 無狀態:HTTP 協議本身是無狀態的,每次請求都是獨立的,服務器不記得之前的請求。比如你第一次請求和第二次請求,服務器不知道這是同一個客戶端。
- 有狀態:通過 Cookie、Session 等技術,讓服務器記住客戶端狀態。比如登錄后,服務器知道你是誰。
?
2.2Cookie
?
- 作用:在客戶端(瀏覽器)存數據,每次請求會自動帶上 Cookie。
- 示例:醫院的就診卡,卡上有病人 ID,每次看病都帶著卡,醫院服務器就知道你是誰。
- 缺點:不安全,因為 Cookie 存在客戶端,可能被篡改。
?
2.3Session
?
- 作用:在服務器存數據,每個客戶端對應一個 Session(通過 SessionID 關聯)。
- 工作流程:
1.?客戶端第一次請求,服務器創建 Session,生成 SessionID,把 SessionID 存到 Cookie 里返回給客戶端。
2.?客戶端后續請求會帶著 Cookie 里的 SessionID,服務器根據 SessionID 找到對應的 Session,獲取用戶信息。
- 示例:學校的學生證,學生證號是 SessionID,學校檔案里存著你的信息(Session 數據)。你帶著學生證(Cookie)去考試,學校根據學生證號(SessionID)查檔案(Session 數據),確認你的身份。
- 優點:安全,因為數據存在服務器,客戶端拿不到真實數據。
?
2.4Cookie 與 Session 的關系
?
- SessionID 存在 Cookie 里,客戶端靠 Cookie 傳遞 SessionID,服務器靠 SessionID 找到 Session 數據。
- 比如登錄時,服務器生成 Session 存用戶信息,把 SessionID 寫進 Cookie 給客戶端。之后客戶端每次請求都帶這個 Cookie,服務器就能識別用戶。
?
代碼示例(獲取 Cookie)
?
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request, HttpServletResponse response) {
? ? // 從請求中取 Cookie
? ? Cookie[] cookies = request.getCookies();
? ? if (cookies != null) {
? ? ? ? for (Cookie cookie : cookies) {
? ? ? ? ? ? System.out.println("Cookie 名: " + cookie.getName() + ", 值: " + cookie.getValue());
? ? ? ? }
? ? }
? ? // 寫 Cookie 到響應
? ? Cookie cookie = new Cookie("testCookie", "testValue");
? ? response.addCookie(cookie);
? ? return "操作 Cookie 成功";
}
?
?
- HttpServletRequest:封裝了 HTTP 請求,能取 Cookie、參數等。
- HttpServletResponse:封裝了 HTTP 響應,能寫 Cookie、返回數據等。
?
三、總結
?
本節從 JSON 傳遞、參數綁定、Cookie/Session 原理到代碼示例,把 Web 開發中“數據傳遞”和“狀態保持”的核心知識點講透了。理解這些內容,你就能搞定前后端聯調、用戶登錄態管理等關鍵需求
?