184 votes

Redirection vers une URL externe à partir d'une action de contrôleur dans Spring MVC

J'ai remarqué que le code suivant redirige l'utilisateur vers une URL à l'intérieur du projet,

@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm, 
                          BindingResult result, ModelMap model) 
{
    String redirectUrl = "yahoo.com";
    return "redirect:" + redirectUrl;
}

alors que le texte suivant redirige correctement comme prévu, mais nécessite http:// ou https://.

@RequestMapping(method = RequestMethod.POST)
    public String processForm(HttpServletRequest request, LoginForm loginForm, 
                              BindingResult result, ModelMap model) 
    {
        String redirectUrl = "http://www.yahoo.com";
        return "redirect:" + redirectUrl;
    }

Je veux que la redirection se fasse toujours vers l'URL spécifiée, qu'elle contienne ou non un protocole valide, et je ne veux pas rediriger vers une vue. Comment puis-je faire cela ?

Merci,

281voto

Vous pouvez le faire de deux façons.

D'abord :

@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public void method(HttpServletResponse httpServletResponse) {
    httpServletResponse.setHeader("Location", projectUrl);
    httpServletResponse.setStatus(302);
}

Deuxièmement :

@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public ModelAndView method() {
    return new ModelAndView("redirect:" + projectUrl);
}

89voto

matsev Points 6761

Vous pouvez utiliser le RedirectView . Copié de la JavaDoc :

Vue qui redirige vers une URL absolue, relative au contexte ou relative à la requête en cours.

Exemple :

@RequestMapping("/to-be-redirected")
public RedirectView localRedirect() {
    RedirectView redirectView = new RedirectView();
    redirectView.setUrl("http://www.yahoo.com");
    return redirectView;
}

Vous pouvez également utiliser un ResponseEntity par exemple

@RequestMapping("/to-be-redirected")
public ResponseEntity<Object> redirectToExternalUrl() throws URISyntaxException {
    URI yahoo = new URI("http://www.yahoo.com");
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setLocation(yahoo);
    return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
}

Et bien sûr, retour redirect:http://www.yahoo.com comme mentionné par d'autres.

67voto

k13i Points 811

Vous pouvez le faire de manière assez concise en utilisant ResponseEntity comme ça :

  @GetMapping
  ResponseEntity<Void> redirect() {
    return ResponseEntity.status(HttpStatus.FOUND)
        .location(URI.create("http://www.yahoo.com"))
        .build();
  }

54voto

daniel.eichten Points 1928

En examinant la mise en œuvre effective de l UrlBasedViewResolver y RedirectView la redirection sera toujours contextRelative si votre cible de redirection commence par /. Ainsi, envoyer un //yahoo.com/path/to/resource n'aiderait pas à obtenir une redirection relative au protocole.

Donc, pour réaliser ce que vous essayez de faire, vous pourriez faire quelque chose comme :

@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm, 
                          BindingResult result, ModelMap model) 
{
    String redirectUrl = request.getScheme() + "://www.yahoo.com";
    return "redirect:" + redirectUrl;
}

37voto

IvanMushketyk Points 1068

Une autre façon de procéder est d'utiliser simplement la fonction sendRedirect méthode :

@RequestMapping(
    value = "/",
    method = RequestMethod.GET)
public void redirectToTwitter(HttpServletResponse httpServletResponse) throws IOException {
    httpServletResponse.sendRedirect("https://twitter.com");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X