Aperçu
Cet article se concentrera sur la mise en œuvre des redirections au printemps et discutera des raisons de chaque stratégie.
Pourquoi rediriger?
Examinons d'abord pourquoi vous devrez peut-être effectuer une redirection dans votre application de printemps.
Bien sûr, il existe de nombreux exemples et raisons possibles. Une simple pourrait être des données de post-formulaire, autour de la double soumission du problème, ou simplement déléguer le flux d'exécution vers une autre méthode de contrôleur.
Une chose à noter est que le modèle de post / redirection / GET typique ne résout pas adéquatement le problème de double engagement - la question de rafraîchir la page avant la fin de l'engagement initial peut toujours entraîner un double engagement.
Rediriger à l'aide de redirectview
Commençons par cette méthode simple - prenons un exemple directement:
Derrière le redirectview, il tirera httpservletResponse.sendRedirect () - cela effectuera la redirection réelle.
Notez comment nous injectons les propriétés redirigées dans la méthode ici - le cadre fait cette partie du travail lourd, nous permettant d'interagir avec ces propriétés.
Nous ajoutons un attribut au modèle RedirectAttributes - Exposez-le en tant que paramètre de requête HTTP. Le modèle contient des objets - généralement des chaînes ou des objets qui peuvent être convertis en chaînes.
Testons maintenant notre fonction de redirection - Utilisez une commande Curl simple pour vous aider:
Le résultat sera:
Redirection à l'aide de la redirection: préfixe
La méthode précédente utilise RedirectView, car elle n'est pas optimale pour certaines raisons.
Tout d'abord, nous sommes maintenant couplés à l'API Spring car nous utilisons RedirectView directement dans notre code.
Deuxièmement, nous devons savoir depuis le début que lors de la mise en œuvre de l'opération de contrôleur, ses résultats seront toujours redirigés, mais ce n'est pas toujours le cas.
Une meilleure option consiste à utiliser la redirection: préfixe - le nom de vue de redirection est injecté dans le contrôleur comme d'autres noms de vue logique. Le contrôleur ne sait même pas que la redirection se produit.
Cela ressemble à ceci:
Lorsque le nom de la vue est renvoyé avec Redirection:, la classe UrlBasedViewResolver (et toutes ses sous-classes) le reconnaît comme une indication spéciale qui doit être redirigée. Le reste du nom de la vue sera traité comme une URL de redirection.
Il y a un endroit pour noter ici - lorsque nous utilisons la vue logique redirige: / redirigédUrl ici, nous faisons une redirection liée au contexte actuel du servlet.
Si vous avez besoin de rediriger vers une URL absolue, nous pouvons utiliser un nom comme celui-ci: Redirection: http: // localhost: 8080 / printemps-redirect / redirectedUrl.
Alors maintenant, lorsque nous exécutons la commande curl:
Nous obtiendrons une redirection immédiatement:
Transfert avec un préfixe avant
Voyons maintenant comment faire quelque chose de légèrement différent - un transfert.
Avant de regarder le code, jetons un coup d'œil à un résumé rapide et de haut niveau de la sémantique du transfert et de la redirection:
La redirection répondra avec une nouvelle URL contenant le code de réponse 302 et l'en-tête de localisation; Ensuite, le navigateur / client fera à nouveau une demande à la nouvelle URL en avant complètement du côté serveur; Le conteneur servlet transmet la même demande à l'URL cible; L'URL du navigateur n'a pas besoin d'être modifiée
Jetons maintenant un coup d'œil au code:
Comme Redirect:, The Forward: Prefix sera analysé par UrlbasedViewResolver et ses sous-classes. En interne, cela crée un internalResourceView qui effectue une opération requestDispatcher.forward () pour la nouvelle vue.
Lorsque nous exécutons la commande avec Curl:
Nous obtiendrons HTTP 405 (méthode non autorisée):
Dans ce cas, nous n'avons qu'une seule demande envoyée du navigateur / client vers le côté serveur par rapport aux deux demandes que nous avons dans la solution de redirection. Bien sûr, les propriétés ajoutées par des redirectes ne sont pas nécessaires.
Propriétés contenant des redirectattributes
Ensuite - regardons les propriétés de passage dans une redirection - profitez des redirectattribures dans le cadre:
Comme mentionné précédemment, nous pouvons insérer des objets de propriété directement dans la méthode - ce qui rend le mécanisme très facile à utiliser.
Notez également que nous ajoutons également un attribut Flash - il s'agit d'une propriété qui ne sera pas ajoutée à l'URL. Nous pouvons réaliser cette propriété - nous pouvons plus tard utiliser @ModelAtTribute ("FlashAttribute") dans la méthode cible finale redirigé pour accéder à l'attribut Flash:
Donc, complétez avec succès - si vous avez besoin d'utiliser Curl pour tester la fonction:
Nous serons redirigés vers le nouvel emplacement:
De cette façon, l'utilisation de redirectattribures au lieu de ModelMap nous donne la possibilité de partager certaines propriétés uniquement entre les deux méthodes impliquées dans l'opération de redirection.
Une autre configuration sans préfixes
Explorons maintenant une autre configuration - Redirection sans préfixes.
Pour y parvenir, nous devons utiliser org.springframework.web.servlet.view.xmlViewResolver:
Au lieu d'org.springframework.web.servlet.view.internalresourceViewResolver que nous avons utilisé dans notre configuration précédente:
Nous devons également définir un Bean RedirectView dans la configuration:
Maintenant, nous pouvons nous référer à ce nouveau haricot via l'ID pour déclencher la redirection:
Pour le tester, nous utilisons à nouveau la commande curl:
Le résultat sera:
Rediriger la demande de demande HTTP Post
Pour les cas d'utilisation comme les paiements bancaires, nous devrons peut-être rediriger les demandes de poste HTTP. Selon le code d'état HTTP renvoyé, la demande de poste peut être redirigé vers HTTP Get ou Publier.
Selon la référence du protocole HTTP 1.1, les codes d'état 301 (supprimés en permanence) et 302 (trouvés) permettent de modifier la méthode de demande de la publication pour obtenir. La spécification définit également les codes d'état 307 (redirection temporaire) et 308 (redirection permanente) qui ne permettent pas de modifier la méthode de demande de la publication à obtenir.
Jetons maintenant un coup d'œil au code pour rediriger la demande de poste vers une autre demande de poste:
Maintenant, utilisons la commande curl pour tester le message redirigé:
Nous sommes redirigés vers l'adresse de destination:
en conclusion
Cet article introduit trois façons différentes de mettre en œuvre des redirections au printemps, comment gérer / passer les attributs lors de l'exécution de ces redirectes et comment gérer les redirections des demandes de post HTTP.
Ce qui précède est le guide de redirection VSpring (Redirection) et les problèmes de stratégie connexes qui vous sont présentés par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!