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,

10voto

Lord Nighton Points 1570

Pour moi, cela fonctionne bien :

@RequestMapping (value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Object> redirectToExternalUrl() throws URISyntaxException {
    URI uri = new URI("http://www.google.com");
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setLocation(uri);
    return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
}

9voto

Pour l'url externe, vous devez utiliser " http://www.yahoo.com "comme url de redirection.

Ceci est expliqué dans le redirection : préfixe de la documentation de référence de Spring.

redirect:/myapp/some/resource

sera redirigé par rapport au contexte actuel de la servlet, tandis qu'un nom tel que

réorienter : http://myhost.com/some/arbitrary/path

redirigera vers une URL absolue

3voto

Vijay Kukkala Points 362

Avez-vous essayé RedirectView où vous pouvez fournir le paramètre contextRelative ?

0voto

Neptune Points 1

Cela fonctionne pour moi, et a résolu le problème "Response to preflight request doesn't pass access control check ...".

Contrôleur

    RedirectView doRedirect(HttpServletRequest request){

        String orgUrl = request.getRequestURL()
        String redirectUrl = orgUrl.replaceAll(".*/test/","http://xxxx.com/test/")

        RedirectView redirectView = new RedirectView()
        redirectView.setUrl(redirectUrl)
        redirectView.setStatusCode(HttpStatus.TEMPORARY_REDIRECT)
        return redirectView
    }

et activer la sécurité

@EnableWebSecurity
class SecurityConfigurer extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable()
    }
}

-1voto

En bref "redirect://yahoo.com" vous prêtera à yahoo.com .

où comme "redirect:yahoo.com" vous prêtera your-context/yahoo.com ie pour ex- localhost:8080/yahoo.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