Spring MVC請(qǐng)求參數(shù)的獲取教程指南
1. 獲取 URL 中的參數(shù)
獲取 URL 中的參數(shù)是通過(guò) @PathVariable 注解實(shí)現(xiàn)的
@RequestMapping("/article/{articleId}")
public String method12(@PathVariable("articleId") String articleId){
return "接收到參數(shù)articleId: " + articleId;
}@RequestMapping("/article/{articleId}")大括號(hào)中的內(nèi)容就相當(dāng)于占位符,可以傳入任何參數(shù),但是不能不傳

多個(gè)參數(shù)也是可以接受的:
@RequestMapping("/article/{articleId}/{name}")
public String method12(@PathVariable String articleId,@PathVariable String name){
return "接收到參數(shù)articleId: " + articleId + ", name :" + name;
}

前面也提到過(guò),路徑中的參數(shù)相當(dāng)于占位符,不能少傳,順序也必須一致

把 required 改為 false 也不行

2. 上傳文件
通過(guò) MultipartFile可以獲取文件的對(duì)象
@RequestMapping("/m12")
public String method13(MultipartFile file){
System.out.println(file.getOriginalFilename());
return "接收到參數(shù)file: " + file.getOriginalFilename();
}3. cookie 和 session 的介紹

cookie 就相當(dāng)于這個(gè)令牌,當(dāng)用戶首次訪問(wèn)一個(gè)網(wǎng)站時(shí),服務(wù)器可以在響應(yīng)中設(shè)置 Cookie,并將其發(fā)送給客戶端瀏覽器。瀏覽器會(huì)將 Cookie 存儲(chǔ)起來(lái)。在后續(xù)的請(qǐng)求中,瀏覽器會(huì)自動(dòng)在請(qǐng)求頭中攜帶該網(wǎng)站的 Cookie 信息發(fā)送給服務(wù)器。服務(wù)器通過(guò)讀取 Cookie 中的數(shù)據(jù)來(lái)識(shí)別用戶和獲取相關(guān)狀態(tài)信息。

Session 是在服務(wù)器端用于跟蹤用戶會(huì)話狀態(tài)的一種機(jī)制,當(dāng)用戶首次與服務(wù)器建立連接時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)唯一的 Session ID,并將這個(gè) ID 返回給客戶端??蛻舳送ǔ?huì)將 Session ID 存儲(chǔ)在 Cookie 中(也可以通過(guò) URL 重寫(xiě)等方式傳遞)。在后續(xù)的請(qǐng)求中,客戶端會(huì)攜帶 Session ID,服務(wù)器通過(guò)這個(gè) ID 來(lái)識(shí)別特定的用戶會(huì)話,并從服務(wù)器端的存儲(chǔ)中獲取相應(yīng)的 Session 數(shù)據(jù)。
上面的學(xué)生信息中,每一個(gè) session ID 都對(duì)應(yīng)一個(gè) session 對(duì)象
例如,用戶在進(jìn)行網(wǎng)上購(gòu)物時(shí),將商品添加到購(gòu)物車。服務(wù)器會(huì)在 Session 中記錄購(gòu)物車的內(nèi)容。當(dāng)用戶在不同頁(yè)面瀏覽或進(jìn)行結(jié)算時(shí),服務(wù)器通過(guò) Session ID 找到對(duì)應(yīng)的購(gòu)物車數(shù)據(jù),確保用戶的購(gòu)物操作在整個(gè)會(huì)話過(guò)程中保持一致。

也就是說(shuō),第一次沒(méi)有 session 時(shí)會(huì)先創(chuàng)建,然后把 session ID 通過(guò) Set-cookie 來(lái)給客戶端

session 是保存在內(nèi)存中的,如果重啟服務(wù)器 session 數(shù)據(jù)就會(huì)消失丟失
cookie 和 session 的區(qū)別:
- cookie 是客戶端保存用戶信息的一種機(jī)制,session 是服務(wù)器端保存用戶信息的一種機(jī)制
- cookie 和 session 之間主要是通過(guò) session ID 關(guān)聯(lián)起來(lái)的,session ID 是 cookie 和 session 之間的橋梁
- cookie 和session 經(jīng)常會(huì)配合使用,但是不是必須配合,可以用 cookie 來(lái)保存一些數(shù)據(jù)在客戶端,不一定是用戶身份信息或 session ID,session 中的 session ID 也不一定必須用 cookie 來(lái)保存,還可以通過(guò)其他來(lái)傳遞,例如通過(guò) URL 來(lái)傳遞
3.1 獲取 cookie
先來(lái)使用創(chuàng)建 HttpServletRequest 對(duì)象來(lái)調(diào)用 getCookies() 的方法來(lái)獲取 cookie,因?yàn)?cookie 還可能為 null,所以也需要進(jìn)行判斷
//獲取cookie
@RequestMapping("getCookie")
public String getCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
}else{
System.out.println("cookie為空");
}
return "獲取cookie成功";
}在 postman 中添加兩個(gè) cookie 值,然后獲取 cookie


調(diào)用 getCookies() 方法來(lái)獲取 cookie 的方式是獲取所有的 cookie,如果需要獲取指定的 cookie 的話還需要遍歷,加入判斷
通過(guò) @CookieValue 注解使用可以直接獲取指定名稱的 cookie
@RequestMapping("getCookie2")
public String getCookie2(@CookieValue("name") String name){
return "從cookie中獲取信息,name:" + name;
}
參數(shù)名稱和 cookie 名是對(duì)應(yīng)的

3.2 獲取 session

由于 getSession 方法是先從 cookie 中找到 session ID,然后根據(jù) session ID 獲取 session,所以可能出現(xiàn) session 為 null 的情況,設(shè)置為 true 就會(huì)創(chuàng)建一個(gè)空的 session,設(shè)置為 false 就不會(huì)創(chuàng)建,默認(rèn)是 true
在獲取 session 對(duì)象之前先設(shè)置好 session
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
//獲取session對(duì)象
HttpSession session = request.getSession();
session.setAttribute("userName","zhangsan");
session.setAttribute("age",18);
return "設(shè)置session成功";
}
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
//先從cookie中找到session ID,然后根據(jù)session ID獲取session
HttpSession session = request.getSession(false);
if(session == null){
return "獲取session為null";
}
String userName = (String) session.getAttribute("userName");
return "從session中獲取userName: " + userName;
}瀏覽器中先訪問(wèn) getSession 時(shí),由于還沒(méi)有設(shè)置 session,所以此時(shí)還獲取不到 session 信息,不過(guò)由于用的是 getSession() 方法,如果 session 為空時(shí)會(huì)創(chuàng)建一個(gè) session,

設(shè)置之后就可以正常獲取了

如果換個(gè)瀏覽器重新獲取就又獲取不到了

這就是因?yàn)樘幱诓煌臅?huì)話中,會(huì)話的 id 是不同的,這也就是相當(dāng)于不同用戶訪問(wèn)時(shí)處于不同的 session 中會(huì)獲取不同的 session ID
也可以直接傳入 HttpSession 對(duì)象來(lái)獲取:
@RequestMapping("/getSession2")
public String getSession2(HttpSession session){
String userName = (String) session.getAttribute("userName");
if(userName !=null){
return "從session中獲取userName: " + userName;
}else {
return "獲取session為null";
}
}還有一種方式獲取就是通過(guò) @SessionAttribute 注解來(lái)獲取
@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute String userName){
return "從session中獲取userName: " + userName;
}通過(guò)這種方式來(lái)獲取指定 session ,這個(gè) session 是必須要設(shè)置好的,如果不存在的話就會(huì)直接報(bào)錯(cuò),要求強(qiáng)制綁定,例如上面的 userName 如果找不到就會(huì)報(bào)錯(cuò)
3. 獲取 header

http 的請(qǐng)求頭是有很多個(gè)鍵值對(duì)的,可以通過(guò)創(chuàng)建 HttpServletRequest 對(duì)象來(lái)調(diào)用 getHeader 方法來(lái)獲取指定的請(qǐng)求頭
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String User_Agent = request.getHeader("User-Agent");
return "User_Agent: " + User_Agent;
}
還可以通過(guò) @RequestHeader注解來(lái)獲取
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String User_Agent){
return "User_Agent: " + User_Agent;
}

通過(guò) Fiddler 抓包可以看到上傳的二進(jìn)制文件

這里的重命名和上面的是不一樣的,這里使用的是 @RequestPart注解

以上就是Spring MVC請(qǐng)求參數(shù)的獲取教程指南的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC請(qǐng)求參數(shù)獲取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Android系統(tǒng)中的root權(quán)限獲得原理
這篇文章主要介紹了詳解Android系統(tǒng)中的Root權(quán)限獲得原理,安卓基于Linux,所以原理也相當(dāng)于Linux中的root用戶,需要的朋友可以參考下2015-08-08
解決springboot中配置過(guò)濾器以及可能出現(xiàn)的問(wèn)題
這篇文章主要介紹了解決springboot中配置過(guò)濾器以及可能出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java實(shí)戰(zhàn)項(xiàng)目 健身管理系統(tǒng)
本文是一個(gè)Java語(yǔ)言編寫(xiě)的實(shí)戰(zhàn)項(xiàng)目,是一個(gè)健身管理系統(tǒng),主要用到了ssm+springboot等技術(shù),技術(shù)含量筆記高,感興趣的童鞋跟著小編往下看吧2021-09-09
Spring Security基本架構(gòu)與初始化操作流程詳解
這篇文章主要介紹了Spring Security基本架構(gòu)與初始化操作流程,Spring Security是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問(wèn)控制解決方案的安全框架2023-03-03
Springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析
這篇文章主要介紹了springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Mybatis插入Oracle數(shù)據(jù)庫(kù)日期型數(shù)據(jù)過(guò)程解析
這篇文章主要介紹了Mybatis插入Oracle數(shù)據(jù)庫(kù)日期型數(shù)據(jù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Java中Spring MVC接收表單數(shù)據(jù)的常用方法
Spring MVC是Spring框架中的一個(gè)模塊,用于開(kāi)發(fā)基于MVC(Model-View-Controller)架構(gòu)的Web應(yīng)用程序,它提供了一種輕量級(jí)的、靈活的方式來(lái)構(gòu)建Web應(yīng)用,同時(shí)提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下2024-05-05

