springboot 重定向方式(redirect前綴)
springboot 重定向(redirect前綴)
相關(guān)注解
@ModelAttribute:讀取modelAndView中的數(shù)據(jù)
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModelAttribute { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean binding() default true; }
示例
@RestController public class Hello3Controller { @RequestMapping("/hello2") public ModelAndView hello2(){ ModelAndView mv=new ModelAndView(); mv.setViewName("redirect:/redirect2"); mv.addObject("attributeName","海賊王"); Person person=new Person(); person.setName("瓜田李下"); person.setAge(20); mv.addObject("person",person); return mv; } @RequestMapping("/redirect2") public String redirect2(String attributeName,@ModelAttribute("attributeName") String name,Person person,ModelAndView mv){ System.out.println(attributeName+" "+name); System.out.println(person); System.out.println(mv.getModelMap().getAttribute("attributeName")); return "redirect2"; } }
控制臺輸出
海賊王 海賊王
Person(name=null, age=null)
null
說明:直接在方法體內(nèi)獲取數(shù)據(jù),參數(shù)可以自動映射,也可使用@ModelAttribute獲取數(shù)據(jù);這種方式只能傳遞字符串,pojo對象不能傳遞
Spring 重定向(Redirect)指南
為什么要重定向?
讓我們先來考慮在 Spring 應(yīng)用程序中為什么您可能需要做一個重定向的原因。
當然有很多可能的例子和原因。 一個簡單的可能是 POST 表單數(shù)據(jù),圍繞雙重提交問題,或者只是將執(zhí)行流委托給另一個控制器方法。
附注一點,典型的 Post / Redirect / Get 模式并不能充分解決雙重提交問題 - 在初始提交完成之前刷新頁面的問題可能仍然會導(dǎo)致雙重提交。
使用 RedirectView 重定向
我們從這個簡單的方法開始 - 直接來一個例子:
在背后,RedirectView 會觸發(fā) HttpServletResponse.sendRedirect() - 這將執(zhí)行實際的重定向。
注意這里我們是如何注入重定向?qū)傩缘椒椒ɡ锩娴?- 由框架完成這部分繁重的工作,讓我們能夠與這些屬性交互。
我們添加 attribute 到模型RedirectAttributes中 - 將其作為 HTTP 查詢參數(shù)(Query parameter)暴露。 該模型包含的對象 - 通常是字符串或可以被轉(zhuǎn)換成字符串的對象。
現(xiàn)在讓我們來測試我們的重定向功能 - 用一個簡單的 curl 命令來幫助實現(xiàn):
結(jié)果將是:
使用 redirect: 前綴進行重定向
前面一個方法使用RedirectView,因為一些原因它并不是最優(yōu)的。
首先,我們現(xiàn)在是耦合于Spring API的,因為我們在我們的代碼里直接地使用RedirectView。
其次,我們需要從一開始就知道,當實現(xiàn)控制器操作的時候,它的結(jié)果將總是重定向的,但情況并非總是如此。
更好的選擇是使用redirect:前綴——重定向視圖名稱像其它邏輯視圖名稱一樣被注入到控制器中??刂破魃踔敛恢乐囟ㄏ蛘诎l(fā)生。
它看起來像是這樣的:
當視圖名稱跟redirect:一起返回的時候,UrlBasedViewResolver類(以及它的所有子類)會將其識別為一個需要進行重定向的特殊指示。視圖名稱剩下的部分會被當作重定向URL。
這里有一個地方需要注意——當我們在這里使用redirect:/redirectedUrl邏輯視圖的時候,我們正在做一個跟當前Servlet上下文相關(guān)的重定向。
如果需要重定向到一個絕對URL,我們可以使用像這樣的名稱:redirect: http://localhost:8080/spring-redirect/redirectedUrl。
所以現(xiàn)在,當我們執(zhí)行curl命令:
我們會立刻得到一個重定向:
使用 forward 前綴轉(zhuǎn)發(fā)
我們現(xiàn)在看看如何做一些略有不同的事——一個轉(zhuǎn)發(fā)。
在看代碼之前,我們先來看一下對轉(zhuǎn)發(fā)與重定向的語義的快速、高層概括:
重定向?qū)⒁园?02響應(yīng)碼和Location頭的新URL進行響應(yīng);然后瀏覽器/客戶端將再次向新的URL發(fā)出請求
轉(zhuǎn)發(fā)完全在服務(wù)器端發(fā)生; Servlet容器將相同的請求轉(zhuǎn)發(fā)到目標URL;瀏覽器中的URL無須改變
現(xiàn)在我們來看看代碼:
與redirect:一樣,forward:前綴將由UrlBasedViewResolver及其子類解析。在內(nèi)部,這將創(chuàng)建一個InternalResourceView,它為新視圖執(zhí)行一個RequestDispatcher.forward()操作。
當我們用curl執(zhí)行該命令時:
我們會得到HTTP 405 (不允許的方法):
與我們在重定向解決方案中的兩個請求相比,在這種情況下,我們只有一個請求從瀏覽器/客戶端發(fā)送到服務(wù)器端。當然,以前由重定向添加的屬性也不需要了。
包含 RedirectAttributes 的屬性
接下來 - 讓我們看看在一個重定向中傳遞屬性 - 充分利用框架中的RedirectAttribures:
如前所述,我們可以直接在方法中插入屬性對象 - 這使得該機制非常容易使用。
還要注意,我們也添加一個Flash屬性 - 這是一個不會被添加到URL中的屬性。我們可以通過這種屬性來實現(xiàn)——我們稍后可以在重定向的最終目標的方法中使用@ModelAttribute(“flashAttribute”)來訪問flash屬性:
因此,圓滿完工——如果你需要使用curl測試該功能:
我們將會被重定向到新的位置:
這樣,使用RedirectAttribures代替ModelMap,賦予我們僅在重定向操作中涉及的兩種方法之間共享一些屬性的能力。
沒有前綴的另一種配置
現(xiàn)在讓我們探索另一種配置——沒有前綴的重定向。
為了實現(xiàn)這一點,我們需要使用org.springframework.web.servlet.view.XmlViewResolver:
代替我們在之前配置里使用的org.springframework.web.servlet.view.InternalResourceViewResolver:
我們還需要在配置里面定義一個RedirectView bean:
現(xiàn)在我們可以通過id來引用這個新的bean來觸發(fā)重定向:
為了測試它,我們再次使用curl命令:
結(jié)果會是:
重定向 HTTP POST 請求 Request
對于類似銀行付款這樣的用例,我們可能需要重定向HTTP POST請求。根據(jù)返回的HTTP狀態(tài)碼,POST請求可以重定向到HTTP GET或POST上。
根據(jù)HTTP 1.1協(xié)議參考,狀態(tài)碼301(永久移除)和302(已找到)允許請求方法從POST更改為GET。該規(guī)范還定義了不允許將請求方法從POST更改為GET的相關(guān)的307(臨時重定向)和308(永久重定向)狀態(tài)碼。
現(xiàn)在,我們來看看將post請求重定向到另一個post請求的代碼:
現(xiàn)在,讓我們使用curl命令來測試下重定向的POST:
我們正在被重定向到目標地址:
結(jié)論
本文介紹了在Spring中實現(xiàn)重定向的三種不同方法,在執(zhí)行這些重定向時如何處理/傳遞屬性以及如何處理HTTP POST請求的重定向。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- springBoot熱部署、請求轉(zhuǎn)發(fā)與重定向步驟詳解
- springboot如何重定向外部網(wǎng)頁
- SpringBoot中處理的轉(zhuǎn)發(fā)與重定向方式
- springboot?實戰(zhàn):異常與重定向問題
- 使用springboot跳轉(zhuǎn)到指定頁面和(重定向,請求轉(zhuǎn)發(fā)的實例)
- springboot如何重定向攜帶數(shù)據(jù) RedirectAttributes
- springboot項目攔截器重定向循環(huán)問題的解決
- 基于springboot redirect重定向路徑問題總結(jié)
- springboot 如何重定向redirect 并隱藏參數(shù)
- Springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析
- SpringBoot后端服務(wù)重定向的實現(xiàn)示例
相關(guān)文章
SpringCloud-Gateway網(wǎng)關(guān)的使用實例教程
Gateway網(wǎng)關(guān)在微服務(wù)架構(gòu)中扮演了不可或缺的角色,通過集中化管理、智能路由和強大的過濾器機制,為構(gòu)建高效、可擴展的微服務(wù)系統(tǒng)提供了有力支持,這篇文章主要介紹了SpringCloud-Gateway網(wǎng)關(guān)的使用,需要的朋友可以參考下2024-03-03SpringBoot @value注解動態(tài)刷新問題小結(jié)
@Value注解 所對應(yīng)的數(shù)據(jù)源來自項目的 Environment 中,我們可以將數(shù)據(jù)庫或其他文件中的數(shù)據(jù),加載到項目的 Environment 中,然后 @Value注解 就可以動態(tài)獲取到配置信息了,這篇文章主要介紹了SpringBoot @value注解動態(tài)刷新,需要的朋友可以參考下2023-09-09@Autowired自動裝配,@Bean注入@Primary,@Qualifier優(yōu)先級講解
這篇文章主要介紹了@Autowired自動裝配,@Bean注入@Primary,@Qualifier優(yōu)先級,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09一文帶你搞懂Java中Synchronized和Lock的原理與使用
這篇文章主要為大家詳細介紹了Java中Synchronized和Lock的原理與使用,文中的示例代碼講解詳細,對我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2023-04-04Java String.replace()方法"無效"的原因及解決方式
這篇文章主要介紹了Java String.replace()方法"無效"的原因及解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Java中@Autowired與@Resource注解的區(qū)別詳解
這篇文章主要介紹了Java中@Autowired與@Resource注解的區(qū)別詳解,@Resource的作用相當于@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按 byName自動注入罷了,@Resource有兩個屬性是比較重要的,需要的朋友可以參考下2023-11-11