Spring MVC'de denetleyici eyleminden harici bir URL'ye yönlendirme


118

Aşağıdaki kodun Kullanıcıyı proje içindeki bir URL'ye yönlendirdiğini fark ettim,

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

oysa, aşağıdakiler amaçlandığı gibi düzgün bir şekilde yönlendirme yapıyor, ancak http: // veya https: // gerektiriyor

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

Yönlendirmenin, içinde geçerli bir protokolü olup olmadığına bakılmaksızın her zaman belirtilen URL'ye yönlendirilmesini istiyorum ve bir görünüme yeniden yönlendirmek istemiyorum. Bunu nasıl yapabilirim?

Teşekkürler,

Yanıtlar:


208

Bunu iki şekilde yapabilirsiniz.

İlk:

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

İkinci:

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

19
ModelAndView yerine doğrudan bir String döndürürseniz daha da basittir.
daniel.eichten

24
Görünüşe göre ilk yöntemde dönüş kodunu 302 olarak ayarlamalısınız. Aksi takdirde bir sunucu, benim durumumda yeniden yönlendirmeye neden olmayan kod 200 ve Konum başlığı içeren bir yanıt döndürür (Firefox 41.0).
Ivan Mushketyk

Harici URL'ye yönlendirme sırasında da çerez ekleyebilir miyiz?
Srikar

1
İlk yöntem gerektirir@ResponseStatus(HttpStatus.FOUND)
lapkritinis

@Rinat Mukhamedgaliev Bu ModelAndView'de ("redirect:" + projectUrl); Açıklama Eğer eklenen şey değer ise, anahtar varsayılan olarak alınacaktır?
JAVA

57

Kullanabilirsiniz RedirectView. Kopyalanan JavaDoc'u :

Mutlak, bağlama göre veya geçerli istekle ilgili URL'ye yönlendirmeleri görüntüleyin

Misal:

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

Ayrıca ResponseEntity, örn.

@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);
}

Ve elbette, redirect:http://www.yahoo.combaşkalarının söylediği gibi geri dönün .


RedirectView benim için işe yarayan tek şeydi!
James111

Yönlendirme Görünümü ile bir stange davranışı yaşıyorum, webshpere'de: [kod] [27/04/17 13: 45: 55: 385 CDT] 00001303 webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E : [Sunucu uygulaması hatası] - [DispatcherPrincipal]: java.io.IOException: mx.isban.security.components.SecOutputFilter $ WrapperRsSecured.sendRedirect (SecOutputFilter.java:234) javax.servlet.http.HttpWresRes'de şablona izin verilmez. sendRedirect (HttpServletResponseWrapper.java:145) [kod]
Carlos de Luna Saenz

49

UrlBasedViewResolver ve RedirectView uygulamalarının gerçek uygulamasına bakıldığında , yönlendirme hedefiniz / ile başlıyorsa yeniden yönlendirme her zaman contextRelative olacaktır. Dolayısıyla bir //yahoo.com/path/to/resource göndermek de protokole göre bir yönlendirme elde etmeye yardımcı olmaz.

Yani denediğiniz şeyi başarmak için aşağıdakilere benzer bir şey yapabilirsiniz:

@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;
}

Ancak bu şekilde yönlendirme bir GET mi yoksa bir POST olarak mı kalıyor? POST olarak nasıl yönlendiririm?
Accollativo

Aslında varsayılan olarak bu bir 302 döndürür, bu da sağlanan url'ye karşı bir GET yayınlaması gerektiği anlamına gelir. Yeniden yönlendirme için aynı yöntemi korumak için farklı bir kod da ayarlamalısınız (HTTP / 1.1'den itibaren 307). Ancak, güvenlik sorunları nedeniyle farklı bir ana bilgisayar / bağlantı noktası kombinasyonu kullanarak mutlak bir adrese karşı giderse tarayıcıların bunu engelleyeceğinden oldukça eminim.
daniel.eichten

26

Bunu yapmanın başka bir yolu da sendRedirectyöntemi kullanmaktır :

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

23

Bunu şu şekilde kullanarak oldukça kısa bir şekilde yapabilirsiniz ResponseEntity:

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

1
Kabul edilen cevap bu olmalıdır. Kurulumu ve kullanımı son derece kolaydır.
cyberbit

9

Benim için iyi çalışıyor:

@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);
}

Postacıda da çalıştığı için bu yöntemin RedirectView'dan daha iyi olduğunu düşünüyorum.
mehdi mohammadi


3

Denediniz mi RedirectView Eğer contextRelative parametreyi sağlayabilir?


Bu parametre ile başlayan (veya olmayan) yollar /için web uygulaması bağlamına göre olması gerekip gerekmediğini kontrol etmek için kullanışlıdır . Yeniden yönlendirme isteği yine aynı ana bilgisayar için olacaktır.
Sotirios Delimanolis

-2

Kısacası "redirect://yahoo.com"size ödünç verecek yahoo.com.

nerede "redirect:yahoo.com"size ödünç verecek your-context/yahoo.comyani eskilocalhost:8080/yahoo.com


her iki çözüm de aynı komuta sahiptir: "Kısaca" redirect: yahoo.com "vs" burada "redirect: yahoo.com" ve yalnızca göreli url yeniden yönlendirmesi çalışıyor.
partizanos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.