欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳細(xì)聊聊Spring MVC重定向與轉(zhuǎn)發(fā)

 更新時(shí)間:2021年09月07日 11:57:10   作者:Dynasty  
大家應(yīng)該都知道請(qǐng)求重定向和請(qǐng)求轉(zhuǎn)發(fā)都是web開(kāi)發(fā)中資源跳轉(zhuǎn)的方式,這篇文章主要給大家介紹了關(guān)于Spring MVC重定向與轉(zhuǎn)發(fā)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

重定向和轉(zhuǎn)發(fā)

重定向經(jīng)過(guò)客戶(hù)端,而轉(zhuǎn)發(fā)沒(méi)有,因此相對(duì)來(lái)說(shuō)轉(zhuǎn)發(fā)更快速。但有時(shí)采用重定向更方便,如:

  1. 重定向到外部網(wǎng)站;
  2. 避免用戶(hù)重新加載頁(yè)面時(shí)再次調(diào)用同樣的動(dòng)作。
return "redirect:/view/"+saveUser.getId();

這里使用重定向來(lái)防止當(dāng)前用戶(hù)重新加載頁(yè)面時(shí)'''saveUser'''被二次調(diào)用。

但是使用重定向無(wú)法輕松地給目標(biāo)頁(yè)面?zhèn)髦?,因此,在Spring3.1后提供了Flash屬性,詳情見(jiàn)后文。

常用處理方式

Controller 視圖方法間的跳轉(zhuǎn),無(wú)非就是帶參跳轉(zhuǎn)和不帶參跳轉(zhuǎn)。常用的方法有通過(guò) String 映射 RequestMapping 實(shí)現(xiàn)重定向,或者通過(guò) ModelAndView 對(duì)象,又或者是 RedirectView 對(duì)象,下面逐一說(shuō)明。

String 重定向

是 return 映射到另一個(gè) Controller 方法的字符串。如果有請(qǐng)求參數(shù),就拼接在 RequestMapping 映射的字符串后面。

// 返回字符串映射的方式
@RequestMapping("hello")
public String hello(HttpServletRequest req, HttpServletResponse resp) {
    doSomething();
    return "redirect:/bye";
    // return "redirect:/bye?username=sudoz";
}

ModelAndView 重定向

另一種方法是通過(guò)返回 ModelAndView 對(duì)象來(lái)實(shí)現(xiàn)跳轉(zhuǎn)。類(lèi)似的,如果有請(qǐng)求參數(shù),也可以通過(guò)類(lèi)似 GET 參數(shù)拼接的方式:

// 返回 ModelAndView 對(duì)象
@RequestMapping("hello")
public ModelAndView hello(HttpServletRequest req, HttpServletResponse resp) {
    doSomething();
    return new ModelAndView("redirect:/bye");
    // return new ModelAndView("redirect:/bye?username=sudoz");
}

RedirectView 重定向

還有一種方法是通過(guò)返回 RedirectView 對(duì)象實(shí)現(xiàn)跳轉(zhuǎn),該方法和上面的不同之處在于,RedirectView 對(duì)象不需要設(shè)置 redirect 前綴:

// 返回 RedirectView 對(duì)象
@RequestMapping("hello")
public RedirectView hello() {
    doSomething();
    return new RedirectView("/bye");
    // return new RedirectView("bye?username=sudoz");
}

帶參跳轉(zhuǎn)

Model在重定向時(shí)會(huì)丟失攜帶的消息

在做方法跳轉(zhuǎn)時(shí),如果要把參數(shù)帶給下一個(gè)方法,像上面代碼里通過(guò)拼接 URL 參數(shù)的方法有時(shí)候并不實(shí)用。因?yàn)閰?shù)不一定都是是字符串,而且瀏覽器對(duì) URL 的長(zhǎng)度是有限制的。RedirectAttributes 對(duì)象可以用來(lái)保存請(qǐng)求重定向時(shí)的參數(shù)。利用 RedirectAttributes 改寫(xiě)上面的代碼:

@RequestMapping("/")
public RedirectView hello(RedirectAttributes attrs) {
    attrs.addAttribute("message", "hello");    
    attrs.addFlashAttribute("username", "world");
    return new RedirectView("hello");
}

@RequestMapping("hello")
    Map<String, String> hello(@ModelAttribute("message") String meaasge,
                              @ModelAttribute("username") String username) {
    Map<String, String> map = new HashMap();
    map.put("message", message);
    map.put("username", username);
    return map;
}

上面的代碼中,調(diào)用 addAttribute() 和 addFlashAttribute() 方法往 RedirectAttributes 對(duì)象中插入了兩個(gè)值,如果看源碼,就能知道,RedirectAttributes 接口的實(shí)現(xiàn)類(lèi) RedirectAttributesModelMap 繼承了 ModelMap,本質(zhì)上就是 HashMap 的子類(lèi),因此可以用來(lái)存儲(chǔ) Key-Value 對(duì)。這兩個(gè)方法都很常用,使用上也必然存在不同:

  • addAttribute() 方法會(huì)把 Key-Value 作為請(qǐng)求參數(shù)添加的 URL 的后面;
  • addFlashAttribute() 方法會(huì)把 Key-Value 暫存在 session 中,在跳轉(zhuǎn)到目標(biāo)方法后,即完成任務(wù),會(huì)從 session 中刪掉;

用 curl 命令來(lái)測(cè)試:

curl -i http://localhost:8080/

HTTP/1.1 302 
Set-Cookie: JSESSIONID=D1CC5E15FA8EF9474C4CED7D4F660E66;path=/;HttpOnly
Location: http://localhost:8080/hello;jsessionid=D1CC5E15FA8EF9474C4CED7D4F660E66?username=sudoz
Content-Language: en-US
Content-Length: 0
Date: Thu, 16 Feb 2017 12:33:46 GMT

可以看到,通過(guò) addAttribute() 添加的鍵值對(duì)變成了 URL 后面的參數(shù),addFlashAttribute() 方法添加的鍵值對(duì)則沒(méi)有出現(xiàn)在 URL 上,而是存儲(chǔ)在了 session 中。跳轉(zhuǎn)的目標(biāo)方法通過(guò) @ModelAttribute("key")注解指定接收的參數(shù)。

redirect 和 forward 的區(qū)別

上面列出的 3 種方法,其實(shí)都是 Spring MVC 在處理請(qǐng)求時(shí)的重定向,即 redirect 跳轉(zhuǎn)。另一種分發(fā)請(qǐng)求的方式是轉(zhuǎn)發(fā),即 forward。二者的區(qū)別從 HTTP 的規(guī)范中就明確:

  • redirect 的 HTTP 返回碼是 302,且跳轉(zhuǎn)的新 URL 會(huì)存儲(chǔ)在 HTTP Response Headers 的 Location 字段中??蛻?hù)端在接收到 Response 后,會(huì)發(fā)起另一次請(qǐng)求,這次請(qǐng)求的 URL 就是重定向的 URL;
  • forward 的轉(zhuǎn)發(fā)過(guò)程只發(fā)生在服務(wù)端;Servlet 容器會(huì)直接把源請(qǐng)求打向目標(biāo) URL,而不會(huì)經(jīng)由客戶(hù)端發(fā)起請(qǐng)求;因此客戶(hù)端接收到的響應(yīng)是來(lái)自轉(zhuǎn)發(fā)后的目標(biāo)方法,但是瀏覽器呈現(xiàn)的 URL 卻并不會(huì)改變,且 forward 不能將參數(shù)轉(zhuǎn)發(fā)出去。

附:請(qǐng)求轉(zhuǎn)發(fā)與重定向的區(qū)別圖例

總結(jié)

到此這篇關(guān)于Spring MVC重定向與轉(zhuǎn)發(fā)的文章就介紹到這了,更多相關(guān)Spring MVC重定向與轉(zhuǎn)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Shiro與Springboot整合開(kāi)發(fā)的基本步驟過(guò)程詳解

    Shiro與Springboot整合開(kāi)發(fā)的基本步驟過(guò)程詳解

    這篇文章主要介紹了Shiro與Springboot整合開(kāi)發(fā)的基本步驟,本文結(jié)合實(shí)例代碼給大家介紹整合過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • gson對(duì)象序列化的示例

    gson對(duì)象序列化的示例

    本文介紹如何將Java對(duì)象序列化為Json文件,然后讀取該Json文件讀取回Java對(duì)象。在下面的示例中,我們創(chuàng)建了一個(gè)Student類(lèi)。然后生成一個(gè)student.json文件,該文件將具有Student對(duì)象的json數(shù)據(jù)。
    2020-11-11
  • Sentinel Dashboard限流規(guī)則保存方式

    Sentinel Dashboard限流規(guī)則保存方式

    這篇文章主要介紹了Sentinel Dashboard限流規(guī)則保存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java 實(shí)現(xiàn)定時(shí)的方法及實(shí)例代碼

    java 實(shí)現(xiàn)定時(shí)的方法及實(shí)例代碼

    這篇文章主要介紹了java 定時(shí)任務(wù)詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • java對(duì)接支付寶支付接口簡(jiǎn)單步驟記錄

    java對(duì)接支付寶支付接口簡(jiǎn)單步驟記錄

    最近項(xiàng)目APP需要接入微信、支付寶支付功能,在分配開(kāi)發(fā)任務(wù)時(shí),聽(tīng)說(shuō)微信支付接口比支付寶支付接口要難實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于java對(duì)接支付寶支付接口的簡(jiǎn)單步驟,需要的朋友可以參考下
    2024-05-05
  • 如何獲取?Spring?heapdump中的明文密碼

    如何獲取?Spring?heapdump中的明文密碼

    Actuator是Spring?Boot提供的應(yīng)用系統(tǒng)監(jiān)控的開(kāi)源框架,在攻防場(chǎng)景里經(jīng)常會(huì)遇到Actuator配置不當(dāng)?shù)那闆r,攻擊者可以直接下載heapdump堆轉(zhuǎn)儲(chǔ)文件,本文介紹如何獲取?Spring?heapdump中的密碼明文,需要的朋友可以參考下
    2022-07-07
  • Java中的類(lèi)加載與類(lèi)卸載方式

    Java中的類(lèi)加載與類(lèi)卸載方式

    這篇文章主要介紹了Java中的類(lèi)加載與類(lèi)卸載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制的詳細(xì)教程

    SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制的詳細(xì)教程

    這篇文章主要介紹了SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)優(yōu)先隊(duì)列實(shí)練

    Java數(shù)據(jù)結(jié)構(gòu)優(yōu)先隊(duì)列實(shí)練

    通常都把隊(duì)列比喻成排隊(duì)買(mǎi)東西,大家都很守秩序,先排隊(duì)的人就先買(mǎi)東西。但是優(yōu)先隊(duì)列有所不同,它不遵循先進(jìn)先出的規(guī)則,而是根據(jù)隊(duì)列中元素的優(yōu)先權(quán),優(yōu)先權(quán)最大的先被取出,這篇文章主要介紹了java優(yōu)先隊(duì)列的真題,感興趣的朋友一起看看吧
    2022-07-07
  • Spring整合Junit詳解

    Spring整合Junit詳解

    Spring 是目前主流的 Java Web 開(kāi)發(fā)框架,是 Java 世界最為成功的框架。該框架是一個(gè)輕量級(jí)的開(kāi)源框架,具有很高的凝聚力和吸引力,本篇文章帶你了解如何配置數(shù)據(jù)源、注解開(kāi)發(fā)以及整合Junit
    2022-07-07

最新評(píng)論