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


118

次のコードがユーザーをプロジェクト内の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に常にリダイレクトして、ビューにリダイレクトしないようにしたい。どうやってやるの?

おかげで、

回答:


208

それには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);
}

19
ModelAndViewではなくStringを直接返すと、さらに簡単になります。
daniel.eichten 2015

24
最初の方法では戻りコードを302に設定する必要があるようです。それ以外の場合、サーバーはコード200とLocationヘッダーを含む応答を返しますが、私の場合はリダイレクトを引き起こしません(Firefox 41.0)。
Ivan Mushketyk 2015年

外部URLへのリダイレクト中にCookieを追加することもできますか?
Srikar 2018年

1
最初の方法が必要@ResponseStatus(HttpStatus.FOUND)
lapkritinis

@Rinat MukhamedgalievこのModelAndView( "redirect:" + projectUrl); 追加されたものが価値である場合、キーとなるステートメントがデフォルトとして採用されますか?
JAVA、

56

を使用できますRedirectViewJavaDocからコピー:

絶対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他の人が述べたように戻ります。


RedirectViewは私のために動作するように見えた唯一のものでした!
James111

リダイレクトビューを使用して一時的な動作を行っていますが、webshpereで次のように取得しています:[コード] [27/04/17 13:45:55:385 CDT] 00001303 webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E :[サーブレットのエラー]-[DispatcherPrincipal]:java.io.IOException:パターンは、javax.servlet.http.HttpServletResponseWrapperのmx.isban.security.components.SecOutputFilter $ WrapperRsSecured.sendRedirect(SecOutputFilter.java:234)では使用できません。 sendRedirect(HttpServletResponseWrapper.java:145)[code]
Carlos de Luna Saenz

49

UrlBasedViewResolverRedirectViewの実際の実装を見ると、リダイレクトターゲットが/で始まる場合、リダイレクトは常に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;
}

しかし、このようにリダイレクトはGETですか、それともPOSTのままですか?POSTとしてリダイレクトするにはどうすればよいですか?
Accollat​​ivo 2016

実際、デフォルトでは、これは302を返します。つまり、提供されたURLに対してGETを発行する必要があります。同じメソッドを維持するリダイレクトの場合は、別のコード(HTTP / 1.1の時点では307)も設定する必要があります。しかし、セキュリティ上の問題により、別のホスト/ポートの組み合わせを使用する絶対アドレスに対してブラウザがこれをブロックする場合は、ブラウザがこれをブロックすると確信しています。
daniel.eichten 2016

26

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

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

22

これは、次のResponseEntityようにしてかなり簡潔な方法で行うことができます。

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

1
これは受け入れられる答えになるはずです。セットアップと使用が非常に簡単です。
cyberbit

9

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

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

この方法は郵便配達員でも機能しているため、RedirectViewよりも優れていると思います。
mehdi mohammadi

8

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

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

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

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

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

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


3

contextRelativeパラメータを指定できるRedirectViewを試しましたか?


このパラメーターは、開始する(または開始しない)パスが/webappコンテキストに対して相対的である必要があるかどうかを確認するのに役立ちます。リダイレクト要求は同じホストに対するものです。
Sotirios Delimanolis 2013

-2

要するに"redirect://yahoo.com"あなたに貸しますyahoo.com

どこに"redirect:yahoo.com"あなたyour-context/yahoo.comがIE を貸しますか?localhost:8080/yahoo.com


どちらのソリューションにも同じコマンドがあります。「簡単に言えば、「redirect:yahoo.com」と「where as「redirect:yahoo.com」」であり、相対URLリダイレクトのみが機能しています。
partizanos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.