概述
本文將重點介紹在Spring 中實現重定向(Redirect),並將討論每個策略背後的原因。
為什麼要重定向?
讓我們先來考慮在Spring 應用程序中為什麼您可能需要做一個重定向的原因。
當然有很多可能的例子和原因。 一個簡單的可能是POST 表單數據,圍繞雙重提交問題,或者只是將執行流委託給另一個控制器方法。
附註一點,典型的Post / Redirect / Get 模式並不能充分解決雙重提交問題- 在初始提交完成之前刷新頁面的問題可能仍然會導致雙重提交。
使用RedirectView 重定向
我們從這個簡單的方法開始- 直接來一個例子:
在背後,RedirectView 會觸發HttpServletResponse.sendRedirect() - 這將執行實際的重定向。
注意這裡我們是如何注入重定向屬性到方法裡面的- 由框架完成這部分繁重的工作,讓我們能夠與這些屬性交互。
我們添加attribute 到模型RedirectAttributes中- 將其作為HTTP 查詢參數(Query parameter)暴露。 該模型包含的對象- 通常是字符串或可以被轉換成字符串的對象。
現在讓我們來測試我們的重定向功能- 用一個簡單的curl 命令來幫助實現:
結果將是:
使用redirect: 前綴進行重定向
前面一個方法使用RedirectView,因為一些原因它並不是最優的。
首先,我們現在是耦合於Spring API的,因為我們在我們的代碼裡直接地使用RedirectView。
其次,我們需要從一開始就知道,當實現控制器操作的時候,它的結果將總是重定向的,但情況並非總是如此。
更好的選擇是使用redirect:前綴――重定向視圖名稱像其它邏輯視圖名稱一樣被注入到控制器中。控制器甚至不知道重定向正在發生。
它看起來像是這樣的:
當視圖名稱跟redirect:一起返回的時候,UrlBasedViewResolver類(以及它的所有子類)會將其識別為一個需要進行重定向的特殊指示。視圖名稱剩下的部分會被當作重定向URL。
這裡有一個地方需要注意――當我們在這裡使用redirect:/redirectedUrl邏輯視圖的時候,我們正在做一個跟當前Servlet上下文相關的重定向。
如果需要重定向到一個絕對URL,我們可以使用像這樣的名稱:redirect: http://localhost:8080/spring-redirect/redirectedUrl。
所以現在,當我們執行curl命令:
我們會立刻得到一個重定向:
使用forward 前綴轉發
我們現在看看如何做一些略有不同的事――一個轉發。
在看代碼之前,我們先來看一下對轉發與重定向的語義的快速、高層概括:
重定向將以包含302響應碼和Location頭的新URL進行響應;然後瀏覽器/客戶端將再次向新的URL發出請求轉發完全在服務器端發生; Servlet容器將相同的請求轉發到目標URL;瀏覽器中的URL無須改變
現在我們來看看代碼:
與redirect:一樣,forward:前綴將由UrlBasedViewResolver及其子類解析。在內部,這將創建一個InternalResourceView,它為新視圖執行一個RequestDispatcher.forward()操作。
當我們用curl執行該命令時:
我們會得到HTTP 405 (不允許的方法):
與我們在重定向解決方案中的兩個請求相比,在這種情況下,我們只有一個請求從瀏覽器/客戶端發送到服務器端。當然,以前由重定向添加的屬性也不需要了。
包含RedirectAttributes 的屬性
接下來- 讓我們看看在一個重定向中傳遞屬性- 充分利用框架中的RedirectAttribures:
如前所述,我們可以直接在方法中插入屬性對象- 這使得該機制非常容易使用。
還要注意,我們也添加一個Flash屬性- 這是一個不會被添加到URL中的屬性。我們可以通過這種屬性來實現――我們稍後可以在重定向的最終目標的方法中使用@ModelAttribute(“flashAttribute”)來訪問flash屬性:
因此,圓滿完工――如果你需要使用curl測試該功能:
我們將會被重定向到新的位置:
這樣,使用RedirectAttribures代替ModelMap,賦予我們僅在重定向操作中涉及的兩種方法之間共享一些屬性的能力。
沒有前綴的另一種配置
現在讓我們探索另一種配置――沒有前綴的重定向。
為了實現這一點,我們需要使用org.springframework.web.servlet.view.XmlViewResolver:
代替我們在之前配置裡使用的org.springframework.web.servlet.view.InternalResourceViewResolver:
我們還需要在配置裡面定義一個RedirectView bean:
現在我們可以通過id來引用這個新的bean來觸發重定向:
為了測試它,我們再次使用curl命令:
結果會是:
重定向HTTP POST 請求Request
對於類似銀行付款這樣的用例,我們可能需要重定向HTTP POST請求。根據返回的HTTP狀態碼,POST請求可以重定向到HTTP GET或POST上。
根據HTTP 1.1協議參考,狀態碼301(永久移除)和302(已找到)允許請求方法從POST更改為GET。該規範還定義了不允許將請求方法從POST更改為GET的相關的307(臨時重定向)和308(永久重定向)狀態碼。
現在,我們來看看將post請求重定向到另一個post請求的代碼:
現在,讓我們使用curl命令來測試下重定向的POST:
我們正在被重定向到目標地址:
結論
本文介紹了在Spring中實現重定向的三種不同方法,在執行這些重定向時如何處理/傳遞屬性以及如何處理HTTP POST請求的重定向。
以上所述是小編給大家介紹的VSpring 重定向(Redirect)指南及相關策略問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!