En guide til våromdirigeringer

1. Oversikt

Denne artikkelen vil fokusere på implementere en omdirigering om våren og vil diskutere resonnementet bak hver strategi.

2. Hvorfor foretar en omdirigering?

La oss først vurdere årsakene til at du kanskje trenger å gjøre en omdirigering i en vårsøknad.

Det er selvfølgelig mange mulige eksempler og grunner. En enkel kan være å POSTE skjemadata, jobbe rundt dobbeltinnleveringsproblemet, eller bare delegere utførelsesflyten til en annen kontrollermetode.

En rask sidemerknad her er at det typiske innleggs- / viderekoblings- / hentemønsteret ikke adresserer problemer med dobbelt innsending - problemer som å oppdatere siden før den første innsendingen er fullført, kan fortsatt resultere i en dobbel innsending.

3. Omdirigering med RedirectView

La oss starte med denne enkle tilnærmingen - og gå rett til et eksempel:

@Controller @RequestMapping ("/") public class RedirectController {@GetMapping ("/ redirectWithRedirectView") public RedirectView redirectWithUsingRedirectView (RedirectAttributes attributes) {attributes.addFlashAttribute ("flashAttribute", "redirectWithRedirectView) attributter.addAttribute ("attributt", "redirectWithRedirectView"); returner ny RedirectView ("redirectedUrl"); }}

Bak scenen, RedirectView vil utløse en HttpServletResponse.sendRedirect () - som vil utføre selve viderekoblingen.

Legg merke til her hvordan vi injiserer omdirigeringsattributtene i metoden - rammeverket vil løfte tungt her og tillate oss å samhandle med disse egenskapene.

Vi legger til modellattributtet Egenskap - som blir eksponert som HTTP-spørringsparameter. Modellen må bare inneholde objekter - generelt strenger eller objekter som kan konverteres til strenger.

La oss nå teste vår omdirigering - ved hjelp av en enkel krølle kommando:

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

Resultatet blir:

HTTP / 1.1 302 Fant server: Apache-Coyote / 1.1 Sted: // localhost: 8080 / spring-rest / redirectedUrl? Attribute = redirectWithRedirectView

4. Viderekobling med prefikset viderekobling:

Den forrige tilnærmingen - ved hjelp av RedirectView - er suboptimal av noen få grunner.

Først - vi er nå koblet til Spring API fordi vi bruker RedirectView direkte i koden vår.

For det andre - vi trenger nå å vite fra starten av, når vi implementerer den kontrolleroperasjonen - at resultatet alltid vil være en omdirigering - noe som kanskje ikke alltid er tilfelle.

Et bedre alternativ er å bruke prefikset viderekobling: - navnet på omdirigeringsvisningen injiseres i kontrolleren som ethvert annet logisk visningsnavn. Kontrolleren er ikke engang klar over at omdirigering skjer.

Slik ser det ut:

@Controller @RequestMapping ("/") public class RedirectController {@GetMapping ("/ redirectWithRedirectPrefix") public ModelAndView redirectWithUsingRedirectPrefix (ModelMap model) {model.addAttribute ("attribute", "redirectWithRedirectPrefix"); returner ny ModelAndView ("redirect: / redirectedUrl", model); }} 

Når et visningsnavn returneres med prefikset viderekobling:de UrlBasedViewResolver (og alle underklassene) vil gjenkjenne dette som en spesiell indikasjon på at en omdirigering må skje. Resten av visningsnavnet vil bli brukt som viderekoblings-URL.

En rask, men viktig merknad her er at når vi bruker dette logiske visningsnavnet her - omdirigering: / omdirigertUrl - vi gjør en omdirigering i forhold til gjeldende Servlet-kontekst.

Vi kan bruke et navn som en omdirigering: // localhost: 8080 / spring-redirect-and-forward / redirectedUrl hvis vi trenger å omdirigere til en absolutt URL.

Så nå, når vi utfører krølle kommando:

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

Vi blir umiddelbart omdirigert:

HTTP / 1.1 302 Fant server: Apache-Coyote / 1.1 Sted: // localhost: 8080 / spring-rest / redirectedUrl? Attribute = redirectWithRedirectPrefix

5. Videre med prefikset framover:

La oss nå se hvordan vi kan gjøre noe litt annerledes - en fremover.

La oss gå over før koden en rask oversikt på høyt nivå av semantikken for fremover mot omdirigering:

  • omdirigere vil svare med en 302 og den nye nettadressen i plassering Overskrift; nettleseren / klienten vil da sende en ny forespørsel til den nye URL-en
  • framover skjer helt på serversiden; Servlet-beholderen videresender den samme forespørselen til mål-URL; URL-en endres ikke i nettleseren

La oss nå se på koden:

@Controller @RequestMapping ("/") public class RedirectController {@GetMapping ("/ forwardWithForwardPrefix") public ModelAndView redirectWithUsingForwardPrefix (ModelMap model) {model.addAttribute ("attribute", "forwardWithForwardPrefix"); returner ny ModelAndView ("fremover: / omdirigertUrl", modell); }} 

Samme som viderekobling:, den framover: prefikset blir løst av UrlBasedViewResolver og underklassene. Internt vil dette skape en InternalResourceView som gjør en RequestDispatcher.forward () til den nye visningen.

Når vi utfører kommandoen med krølle:

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

Vi får HTTP 405 (Metoden er ikke tillatt):

HTTP / 1.1 405 Metode ikke tillatt Server: Apache-Coyote / 1.1 Tillat: GET Innholdstype: tekst / html; charset = utf-8

For å avslutte, sammenlignet med de to forespørslene vi hadde i tilfelle omdirigeringsløsningen, har vi i dette tilfellet bare en enkelt forespørsel som går ut fra nettleseren / klienten til serversiden. Attributtet som tidligere ble lagt til av viderekoblingen, mangler selvfølgelig også.

6. Attributter Med RedirectAttributter

Neste - la oss se nærmere på passerende attributter i en omdirigering - utnytte rammeverket fullt ut med Viderekobling:

@GetMapping ("/ redirectWithRedirectAttributes") offentlig RedirectView redirectWithRedirectAttributes (RedirectAttribute attributter) {attributter.addFlashAttribute ("flashAttribute", "redirectWithRedirectAttributter"); attributter.addAttribute ("attributt", "redirectWithRedirectAttributter"); returner ny RedirectView ("redirectedUrl"); } 

Som vi så før, kan vi injisere attributtobjektet i metoden direkte - noe som gjør denne mekanismen veldig enkel å bruke.

Legg også merke til det vi legger også til et flashattributt - dette er et attributt som ikke kommer inn i URL-en. Det vi kan oppnå med denne typen attributter er - vi kan senere få tilgang til flash-attributtet ved hjelp av @ModelAttribute (“flashAttribute”)bare i metoden som er det endelige målet for omdirigering:

@GetMapping ("/ redirectedUrl") public ModelAndView redirection (ModelMap model, @ModelAttribute ("flashAttribute") Object flashAttribute) {model.addAttribute ("redirectionAttribute", flashAttribute); returner ny ModelAndView ("omdirigering", modell); } 

Så, for å avslutte - hvis vi tester funksjonaliteten med krølle:

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

Vi blir omdirigert til det nye stedet:

HTTP / 1.1 302 funnet server: Apache-Coyote / 1.1 Set-Cookie: JSESSIONID = 4B70D8FADA2FD6C22E73312C2B57E381; Sti = / vårstøtte /; HttpOnly Location: // localhost: 8080 / spring-rest / redirectedUrl; jsessionid = 4B70D8FADA2FD6C22E73312C2B57E381? attributt = redirectWithRedirectAttributter

På den måten, bruker Viderekobling i stedet for en ModelMap gir oss muligheten bare å dele noen attributter mellom de to metodene som er involvert i omdirigeringsoperasjonen.

7. En alternativ konfigurasjon uten prefikset

La oss nå utforske en alternativ konfigurasjon - en omdirigering uten å bruke prefikset.

For å oppnå dette må vi bruke en org.springframework.web.servlet.view.XmlViewResolver:

  /WEB-INF/spring-views.xml 

I stedet for org.springframework.web.servlet.view.InternalResourceViewResolver vi brukte i forrige konfigurasjon:

Vi må også definere en RedirectView bønne i konfigurasjonen:

Nå kan vi utløse omdirigering ved å referere til denne nye bønnen etter id:

@Controller @RequestMapping ("/") public class RedirectController {@GetMapping ("/ redirectWithXMLConfig") public ModelAndView redirectWithUsingXMLConfig (ModelMap model) {model.addAttribute ("attribute", "redirectWithXMLConfig"); returner ny ModelAndView ("RedirectedUrl", modell); }} 

Og for å teste det, bruker vi igjen krølle kommando:

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

Resultatet blir:

HTTP / 1.1 302 Fant server: Apache-Coyote / 1.1 Sted: // localhost: 8080 / spring-rest / redirectedUrl? Attribute = redirectWithRedirectView

8. Omdirigere en HTTP POST-forespørsel

For brukstilfeller som bankbetalinger, kan det hende vi må omdirigere en HTTP POST-forespørsel. Avhengig av HTTP-statuskoden som returneres, kan POST-forespørsel omdirigeres til en HTTP GET eller POST.

I henhold til HTTP 1.1-protokollreferanse tillater statuskoder 301 (flyttet permanent) og 302 (funnet) forespørselsmetoden å bli endret fra POST til GET. Spesifikasjonen definerer også de tilsvarende 307 (midlertidige viderekoblinger) og 308 (permanente viderekoblinger) statuskoder som ikke tillater forespørselsmetoden å bli endret fra POST til GET.

La oss nå se på koden for å omdirigere en forespørsel om innlegg til en annen forespørsel om innlegg:

@PostMapping ("/ redirectPostToPost") offentlig ModelAndView redirectPostToPost (HttpServletRequest forespørsel) {request.setAttribute (View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT); returner ny ModelAndView ("redirect: / redirectedPostToPost"); }
@PostMapping ("/ redirectedPostToPost") offentlig ModelAndView omdirigertPostToPost () {returner ny ModelAndView ("omdirigering"); }

La oss nå teste viderekoblingen av POST ved hjelp av krølle kommando:

krøll -L --verbose -X POST // localhost: 8080 / spring-rest / redirectPostToPost

Vi blir omdirigert til bestemmelsesstedet:

> POST / omdirigertPostToPost HTTP / 1.1> Vert: localhost: 8080> Brukeragent: curl / 7.49.0> Godta: * / *> <HTTP / 1.1 200 <Innholdstype: applikasjon / json; charset = UTF-8 < Transfer-Encoding: chunked <Date: Tue, 8. Aug 2017 07:33:00 GMT {"id": 1, "content": "redirect complete"}

9. Konklusjon

Denne artikkelen illustrert tre forskjellige tilnærminger for å implementere en omdirigering på våren, hvordan man skal håndtere / passere attributter når man gjør disse omdirigeringene, samt hvordan man håndterer omdirigeringer av HTTP POST-forespørsler.


$config[zx-auto] not found$config[zx-overlay] not found