Útmutató a tavaszi átirányításokhoz

1. Áttekintés

Ez a cikk a következőkre fog összpontosítani átirányítás végrehajtása tavasszal és megvitatja az egyes stratégiák mögött álló érvelést.

2. Miért kell átirányítani?

Először vegyük fontolóra azok az okok, amelyek miatt szükség lehet átirányításra tavaszi alkalmazásban.

Természetesen számos lehetséges példa és ok áll rendelkezésre. Az egyik egyszerű lehet az Űrlapadatok kiküldése, a kettős benyújtási probléma kiküszöbölése, vagy csak a végrehajtási folyamat átruházása egy másik vezérlő módszerre.

Rövid megjegyzés, hogy a tipikus Post / Redirect / Get minta nem kezeli megfelelően a kettős beküldési problémákat - például az oldal frissítése az eredeti benyújtás befejezése előtt még mindig kettős beküldést eredményezhet.

3. Átirányítás a RedirectView

Kezdjük ezzel az egyszerű megközelítéssel - és menj egyenesen egy példához:

@Controller @RequestMapping ("/") public class RedirectController {@GetMapping ("/ redirectWithRedirectView") public RedirectView redirectWithUsingRedirectView (RedirectAttributes attributes) {attributes.addFlashAttribute ("flashAttribute", "redirectWithRed; attributes.addAttribute ("attribútum", "redirectWithRedirectView"); return new RedirectView ("redirectedUrl"); }}

A színfalak mögött, RedirectView kiváltja a HttpServletResponse.sendRedirect () - amely végrehajtja a tényleges átirányítást.

Figyelje meg itt, hogyan az átirányítási attribútumokat injektáljuk a módszerbe - a keretrendszer itt komoly nehézségekkel jár és lehetővé teszi számunkra, hogy kölcsönhatásba lépjünk ezekkel az attribútumokkal.

Hozzáadjuk a modell attribútumot tulajdonság - amely HTTP lekérdezési paraméterként lesz kitéve. A modell csak objektumokat tartalmazhat - általában karakterláncokat vagy Stringekké alakítható objektumokat.

Most teszteljük az átirányítást - egy egyszerű segítségével becsavar parancs:

curl -i // localhost: 8080 / spring-rest / redirectWithRedirectView

Az eredmény:

HTTP / 1.1 302 megtalált kiszolgáló: Apache-Coyote / 1.1 Hely: // localhost: 8080 / spring-rest / redirectedUrl? Attribútum = redirectWithRedirectView

4. Átirányítás az előtaggal átirányítás:

Az előző megközelítés - a RedirectView - néhány okból nem optimális.

Először - most összekapcsolódtunk a Spring API-val, mert a RedirectView közvetlenül a kódunkban.

Másodszor - most már a kezdetektől fogva tudnunk kell a vezérlő működésének végrehajtásakor -, hogy az eredmény mindig átirányítás lesz - ami nem mindig így van.

Jobb megoldás az előtag használata átirányítás: - az átirányítási nézet nevét a vezérlőbe injektáljuk, mint bármely más logikai nézet nevét. A vezérlő nem is tudja, hogy átirányítás történik.

Így néz ki:

@Controller @RequestMapping ("/") public class RedirectController {@GetMapping ("/ redirectWithRedirectPrefix") public ModelAndView redirectWithUsingRedirectPrefix (ModelMap model) {model.addAttribute ("attribútum", "redirectWithRedirectPref; return new ModelAndView ("redirect: / redirectedUrl", modell); }} 

Amikor a nézet nevét az előtag adja vissza átirányítás:a UrlBasedViewResolver (és az összes alosztálya) ezt felismeri, hogy az átirányítás megtörténik. A nézet többi részét az átirányító URL-ként használják.

Gyors, de fontos megjegyzés, hogy - amikor ezt a logikai nézet nevet használjuk itt - átirányítás: / redirectedUrl - átirányítást hajtunk végre a jelenlegi Servlet-kontextushoz viszonyítva.

Használhatunk olyan nevet, mint egy átirányítás: // localhost: 8080 / spring-redirect-and-forward / redirectedUrl ha át kell irányítanunk egy abszolút URL-re.

Tehát most, amikor végrehajtjuk a becsavar parancs:

curl -i // localhost: 8080 / spring-rest / redirectWithRedirectPrefix

Azonnal átirányítjuk:

HTTP / 1.1 302 megtalált kiszolgáló: Apache-Coyote / 1.1 Hely: // localhost: 8080 / spring-rest / redirectedUrl? Attribútum = redirectWithRedirectPrefix

5. Továbbítás az előtaggal előre:

Most nézzük meg, hogyan lehet valami kissé mást tenni - előre.

A kód előtt menjünk át gyors, magas szintű áttekintés az előre és az átirányítás szemantikájáról:

  • átirányítás 302-vel és az új URL-lel válaszol a Elhelyezkedés fejléc; a böngésző / kliens ekkor újabb kérést küld az új URL-re
  • előre teljesen szerver oldalon történik; a Servlet-tároló ugyanazt a kérést továbbítja a cél URL-re; az URL nem változik a böngészőben

Most nézzük meg a kódot:

@Controller @RequestMapping ("/") public class RedirectController {@GetMapping ("/ forwardWithForwardPrefix") public ModelAndView redirectWithUsingForwardPrefix (ModelMap model) {model.addAttribute ("attribútum", "forwardWithForwardPrefix; return new ModelAndView ("forward: / redirectedUrl", modell); }} 

Ugyanaz, mint a átirányítás:, a előre: előtagot feloldja UrlBasedViewResolver és annak alosztályai. Belsőleg ez létrehoz egy InternalResourceView amely a RequestDispatcher.forward () az új nézethez.

Amikor a parancsot a gombbal hajtjuk végre becsavar:

curl -I // localhost: 8080 / spring-rest / forwardWithForwardPrefix 

Megkapjuk a HTTP 405-öt (a módszer nem engedélyezett):

HTTP / 1.1 405 A módszer nem engedélyezett Szerver: Apache-Coyote / 1.1 Engedélyezés: GET Content-Type: text / html; charset = utf-8

Összefoglalva, az átirányítási megoldás esetében kapott két kérelemhez képest ebben az esetben csak egyetlen kérésünk van a böngészőből / kliensből a szerver oldalra. Az átirányítás által korábban hozzáadott attribútum természetesen szintén hiányzik.

6. Attribútumok a RedirectAttributes

Következő - nézzük meg közelebbről attribútumok átadása átirányításban - a keret teljes kihasználása a RedirectAttribures:

@GetMapping ("/ redirectWithRedirectAttributes") public RedirectView redirectWithRedirectAttributes (RedirectAttributes attribútumok) {attributes.addFlashAttribute ("flashAttribute", "redirectWithRedirectAttributes"); attributes.addAttribute ("attribútum", "redirectWithRedirectAttributes"); return new RedirectView ("redirectedUrl"); } 

Amint azt korábban láttuk, az injektálhatjuk az attribútum objektumot közvetlenül a módszerbe - ami nagyon megkönnyíti a mechanizmus használatát.

Figyelje meg azt is hozzáadunk egy flash attribútumot is - ez egy attribútum, amely nem kerül be az URL-be. Amit egy ilyen attribútummal el tudunk érni, az a későbbiekben a @ModelAttribute („flashAttribute”)csak abban a módszerben, amely az átirányítás végső célja:

@GetMapping ("/ redirectedUrl") nyilvános ModelAndView átirányítás (ModelMap modell, @ModelAttribute ("flashAttribute") Object flashAttribute) {model.addAttribute ("redirectionAttribute", flashAttribute); return new ModelAndView ("átirányítás", modell); } 

Tehát összefoglalva - ha a funkcionalitást teszteljük becsavar:

curl -i // localhost: 8080 / spring-rest / redirectWithRedirectAttributes

Átirányítunk az új helyre:

HTTP / 1.1 302 Talált kiszolgáló: Apache-Coyote / 1.1 Set-Cookie: JSESSIONID = 4B70D8FADA2FD6C22E73312C2B57E381; Útvonal = / rugós-pihenő /; HttpOnly Location: // localhost: 8080 / spring-rest / redirectedUrl; jsessionid = 4B70D8FADA2FD6C22E73312C2B57E381? attribute = redirectWithRedirectAttributes

Így használva RedirectAttribures a helyett ModelMap csak megosztásra ad lehetőséget néhány attribútum a két módszer között amelyek részt vesznek az átirányítási műveletben.

7. Alternatív konfiguráció előtag nélkül

Vizsgáljuk meg most egy alternatív konfigurációt - egy átirányítást az előtag használata nélkül.

Ennek eléréséhez használnunk kell egy org.springframework.web.servlet.view.XmlViewResolver:

  /WEB-INF/spring-views.xml 

Ahelyett org.springframework.web.servlet.view.InternalResourceViewResolver az előző konfigurációban használtuk:

Meg kell határoznunk a RedirectView bab a konfigurációban:

Most már tehetjük indítsa el az átirányítást úgy, hogy erre az új babra hivatkozik:

@Controller @RequestMapping ("/") public class RedirectController {@GetMapping ("/ redirectWithXMLConfig") public ModelAndView redirectWithUsingXMLConfig (ModelMap model) {model.addAttribute ("attribútum", "redirectWithXMLConfig"; return new ModelAndView ("RedirectedUrl", modell); }} 

És teszteléséhez ismét felhasználjuk a becsavar parancs:

curl -i // localhost: 8080 / spring-rest / redirectWithRedirectView

Az eredmény:

HTTP / 1.1 302 Megtalált szerver: Apache-Coyote / 1.1 Hely: // localhost: 8080 / spring-rest / redirectedUrl? Attribútum = redirectWithRedirectView

8. Átirányítja a HTTP POST kérést

Olyan felhasználási eseteknél, mint a banki fizetések, előfordulhat, hogy át kell irányítanunk egy HTTP POST kérést. A visszaküldött HTTP állapotkódtól függően a POST kérés átirányítható egy HTTP GET vagy POST címre.

A HTTP 1.1 protokoll hivatkozásának megfelelően a 301 (Állandóan áthelyezve) és a 302 (Megtalált) állapotkódok lehetővé teszik a kérési módszer megváltoztatását POST-ról GET-re. A specifikáció meghatározza a megfelelő 307 (Ideiglenes átirányítás) és 308 (Állandó átirányítás) állapotkódokat is, amelyek nem teszik lehetővé a kérelem metódusának módosítását POST-ról GET-re.

Most nézzük meg a postai kérelem átirányításának kódját egy másik postai kérelemhez:

@PostMapping ("/ redirectPostToPost") nyilvános ModelAndView redirectPostToPost (HttpServletRequest kérés) {request.setAttribute (View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT); return new ModelAndView ("redirect: / redirectedPostToPost"); }
@PostMapping ("/ redirectedPostToPost") public ModelAndView redirectedPostToPost () {return new ModelAndView ("redirection"); }

Most teszteljük a POST átirányítását a becsavar parancs:

curl -L --verbose -X POST // localhost: 8080 / spring-rest / redirectPostToPost

Átirányítunk a rendeltetési helyre:

> POST / redirectedPostToPost HTTP / 1.1> Host: localhost: 8080> User-Agent: curl / 7.49.0> Elfogadás: * / *> <HTTP / 1.1 200 <Content-Type: application / json; charset = UTF-8 < Transzfer-kódolás: darabos <Dátum: Kedd, 2017. augusztus 8., 07:33:00 GMT {"id": 1, "content": "átirányítás befejezve"}

9. Következtetés

Ez a cikk szemlélteti három különböző megközelítés az átirányítás tavasszal történő végrehajtására, hogyan kell kezelni / átadni az attribútumokat ezen átirányítások végrehajtásakor, valamint a HTTP POST kérések átirányításainak kezelését.