亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring MVC請求參數(shù)的獲取教程指南

 更新時(shí)間:2024年10月24日 08:51:06   作者:2的n次方_  
本文介紹了SpringMVC中如何獲取各種類型的請求參數(shù),包括基本類型、POJO、數(shù)組、集合以及RESTful風(fēng)格的參數(shù),還討論了請求參數(shù)中文亂碼的解決方案,參數(shù)綁定的注解如@RequestParam,以及自定義類型轉(zhuǎn)換器的實(shí)現(xiàn),需要的朋友可以參考下

1. 獲取 URL 中的參數(shù)

獲取 URL 中的參數(shù)是通過 @PathVariable 注解實(shí)現(xiàn)的

@RequestMapping("/article/{articleId}")
public String method12(@PathVariable("articleId") String articleId){
    return "接收到參數(shù)articleId: " + articleId;
}

@RequestMapping("/article/{articleId}")大括號中的內(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;
}

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

把 required 改為 false 也不行

2. 上傳文件

通過 MultipartFile可以獲取文件的對象

@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)用戶首次訪問一個(gè)網(wǎng)站時(shí),服務(wù)器可以在響應(yīng)中設(shè)置 Cookie,并將其發(fā)送給客戶端瀏覽器。瀏覽器會(huì)將 Cookie 存儲(chǔ)起來。在后續(xù)的請求中,瀏覽器會(huì)自動(dòng)在請求頭中攜帶該網(wǎng)站的 Cookie 信息發(fā)送給服務(wù)器。服務(wù)器通過讀取 Cookie 中的數(shù)據(jù)來識別用戶和獲取相關(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 中(也可以通過 URL 重寫等方式傳遞)。在后續(xù)的請求中,客戶端會(huì)攜帶 Session ID,服務(wù)器通過這個(gè) ID 來識別特定的用戶會(huì)話,并從服務(wù)器端的存儲(chǔ)中獲取相應(yīng)的 Session 數(shù)據(jù)。

上面的學(xué)生信息中,每一個(gè) session ID 都對應(yīng)一個(gè) session 對象

例如,用戶在進(jìn)行網(wǎng)上購物時(shí),將商品添加到購物車。服務(wù)器會(huì)在 Session 中記錄購物車的內(nèi)容。當(dāng)用戶在不同頁面瀏覽或進(jìn)行結(jié)算時(shí),服務(wù)器通過 Session ID 找到對應(yīng)的購物車數(shù)據(jù),確保用戶的購物操作在整個(gè)會(huì)話過程中保持一致。

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

session 是保存在內(nèi)存中的,如果重啟服務(wù)器 session 數(shù)據(jù)就會(huì)消失丟失

cookie 和 session 的區(qū)別:

  1. cookie 是客戶端保存用戶信息的一種機(jī)制,session 是服務(wù)器端保存用戶信息的一種機(jī)制
  2. cookie 和 session 之間主要是通過 session ID 關(guān)聯(lián)起來的,session ID 是 cookie 和 session 之間的橋梁
  3. cookie 和session 經(jīng)常會(huì)配合使用,但是不是必須配合,可以用 cookie 來保存一些數(shù)據(jù)在客戶端,不一定是用戶身份信息或 session ID,session 中的 session ID 也不一定必須用 cookie 來保存,還可以通過其他來傳遞,例如通過 URL 來傳遞

3.1 獲取 cookie

先來使用創(chuàng)建 HttpServletRequest 對象來調(diào)用 getCookies() 的方法來獲取 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() 方法來獲取 cookie 的方式是獲取所有的 cookie,如果需要獲取指定的 cookie 的話還需要遍歷,加入判斷

通過 @CookieValue 注解使用可以直接獲取指定名稱的 cookie

@RequestMapping("getCookie2")
public String getCookie2(@CookieValue("name") String name){
    return "從cookie中獲取信息,name:" + name;
}

參數(shù)名稱和 cookie 名是對應(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 對象之前先設(shè)置好 session

@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
//獲取session對象
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;
}

瀏覽器中先訪問 getSession 時(shí),由于還沒有設(shè)置 session,所以此時(shí)還獲取不到 session 信息,不過由于用的是 getSession() 方法,如果 session 為空時(shí)會(huì)創(chuàng)建一個(gè) session,

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

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

這就是因?yàn)樘幱诓煌臅?huì)話中,會(huì)話的 id 是不同的,這也就是相當(dāng)于不同用戶訪問時(shí)處于不同的 session 中會(huì)獲取不同的 session ID

也可以直接傳入 HttpSession 對象來獲?。?/p>

@RequestMapping("/getSession2")
public String getSession2(HttpSession session){
String userName = (String) session.getAttribute("userName");
if(userName !=null){
    return "從session中獲取userName: " + userName;
}else {
    return "獲取session為null";
}
}

還有一種方式獲取就是通過 @SessionAttribute 注解來獲取

@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute String userName){
    return "從session中獲取userName: " + userName;
}

通過這種方式來獲取指定 session ,這個(gè) session 是必須要設(shè)置好的,如果不存在的話就會(huì)直接報(bào)錯(cuò),要求強(qiáng)制綁定,例如上面的 userName 如果找不到就會(huì)報(bào)錯(cuò)

3. 獲取 header

http 的請求頭是有很多個(gè)鍵值對的,可以通過創(chuàng)建 HttpServletRequest 對象來調(diào)用 getHeader 方法來獲取指定的請求頭

@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String User_Agent = request.getHeader("User-Agent");
return "User_Agent: " + User_Agent;
}

還可以通過 @RequestHeader注解來獲取

@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String User_Agent){
    return "User_Agent: " + User_Agent;
}

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

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

以上就是Spring MVC請求參數(shù)的獲取教程指南的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC請求參數(shù)獲取的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot?Security的自定義異常處理

    SpringBoot?Security的自定義異常處理

    這篇文章主要介紹了SpringBoot?Security的自定義異常處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作的代碼示例

    SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作的代碼示例

    Zookeeper是一個(gè)Apache開源的分布式的應(yīng)用,為系統(tǒng)架構(gòu)提供協(xié)調(diào)服務(wù),ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶,本文給大家介紹了SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作,需要的朋友可以參考下
    2024-05-05
  • Java合并兩個(gè)相同的List集合的四種方法解析

    Java合并兩個(gè)相同的List集合的四種方法解析

    這篇文章主要給大家介紹了關(guān)于Java合并兩個(gè)相同的List集合的四種方法,在Java編程中常需合并兩個(gè)List,常用addAll()方法,簡單高效,Java8起可用Stream的concat()方法,并發(fā)場景下,CopyOnWriteArrayList類保證線程安全,Collections.union()合并且去重,需要的朋友可以參考下
    2024-10-10
  • 將BigDecimal轉(zhuǎn)成字符串為科學(xué)計(jì)數(shù)法的踩坑記錄

    將BigDecimal轉(zhuǎn)成字符串為科學(xué)計(jì)數(shù)法的踩坑記錄

    這篇文章主要介紹了將BigDecimal轉(zhuǎn)成字符串為科學(xué)計(jì)數(shù)法的踩坑記錄,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 聊聊注解@controller@service@component@repository的區(qū)別

    聊聊注解@controller@service@component@repository的區(qū)別

    這篇文章主要介紹了聊聊注解@controller@service@component@repository的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java讀取properties文件內(nèi)容的幾種方式詳解

    Java讀取properties文件內(nèi)容的幾種方式詳解

    這篇文章主要介紹了Java讀取properties文件內(nèi)容的幾種方式詳解,讀取properties配置文件在實(shí)際的開發(fā)中使用的很多,本文來介紹常用的幾種實(shí)現(xiàn)方式,需要的朋友可以參考下
    2023-11-11
  • 通過RedisTemplate連接多個(gè)Redis過程解析

    通過RedisTemplate連接多個(gè)Redis過程解析

    這篇文章主要介紹了通過RedisTemplate連接多個(gè)Redis過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段

    Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段

    這篇文章主要介紹了Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段,我們將重點(diǎn)關(guān)注兩種不同的方法,以展示框架的多功能性以及我們可以使用它的靈活方式。 需要的朋友可以參考下
    2019-05-05
  • SpringMVC源碼之HandlerMapping處理器映射器解析

    SpringMVC源碼之HandlerMapping處理器映射器解析

    這篇文章主要介紹了SpringMVC源碼之HandlerMapping處理器映射器解析,在Spring?MVC中,HandlerMapping處理器映射器用于確定請求處理器對象,請求處理器可以是任何對象,只要它們使用了@Controller注解或注解@RequestMapping,需要的朋友可以參考下
    2023-08-08
  • Java設(shè)計(jì)模式--代理模式

    Java設(shè)計(jì)模式--代理模式

    代理就是一個(gè)人或者一個(gè)機(jī)構(gòu)代表另一個(gè)人或者另一個(gè)機(jī)構(gòu)采取行動(dòng)。在一些情況下,一個(gè)客戶不想或者不能夠直接引用一個(gè)對象,而代理對象可以在客戶端和目標(biāo)對象之前起到中介的作用
    2021-07-07

最新評論