web-dev-qa-db-ja.com

Spring MVCのコントローラアクションから外部URLへのリダイレクト

次のコードでは、ユーザーをプロジェクト内のURLにリダイレクトしています。

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

一方、以下は意図したとおりに正しくリダイレ​​クトされていますが、http://または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;
    }

有効なプロトコルが含まれているかどうかにかかわらず、リダイレクトを常に指定されたURLにリダイレクトし、ビューにリダイレクトしたくない場合に使用します。どうやってやるの?

ありがとう、

90
Jake

それには2つの方法があります。

最初:

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

第二:

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

RedirectViewを使用できます。 JavaDoc からコピーしたもの

絶対URL、コンテキスト相対URL、または現在のリクエスト相対URLにリダイレクトするビュー

例:

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

ResponseEntityを使うこともできます。

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

そしてもちろん、他の人が言ったようにredirect:http://www.yahoo.comを返してください。

48
matsev

rlBasedViewResolver および RedirectView の実際の実装を調べると、リダイレクト先が/で始まる場合、リダイレクトは常にcontextRelativeになります。そのため、//yahoo.com/path/to/resourceを送信しても、プロトコルの相対リダイレクトを取得するのに役立ちません。

だからあなたがしようとしていることを達成するためには、次のようにすることができます。

@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;
}
47
daniel.eichten

それを行う別の方法は、sendRedirectメソッドを使用することです。

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

外部URLの場合、リダイレクトURLとして " http://www.yahoo.com "を使用する必要があります。

これはSpringリファレンスドキュメントの redirect:prefix で説明されています。

リダイレクト:/ myapp/some/resource

現在のサーブレットコンテキストを基準にしてリダイレクトします。

リダイレクト: http://myhost.com/some/arbitrary/path

絶対URLにリダイレクトします

8
sreeprasad

私にとってはうまくいきます:

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

あなたは試してみました RedirectView あなたはcontextRelativeパラメータを提供することができますか?

3
Vijay Kukkala

このようにResponseEntityを使用すると、かなり簡潔な方法でこれを行うことができます。

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