web-dev-qa-db-ja.com

ジャージーjax.rsクライアント2.5はHTTPからHTTPSへのリダイレクトに従います

RESTサーバーをホストしているTomcatサーバーがHTTP(ポート9080)からHTTPS(ポート9443)に通話をリダイレクトする設定があります。

Jersey 2.5実装を使用していますが、リダイレクトに従うようにクライアントを構成できません。

これはSO question( Jerseyクライアントはリダイレクトに従わない )ですが、jersey 1.Xシリーズ用に提供されており、APIが変更されています。

次のテストコードを使用して、2.5に適合させようとしました。

 SSLContextProvider ssl = new TrustAllSSLContextImpl(); // just trust all certs
 Response response  =     ClientBuilder.newBuilder()
     .sslContext(ssl.getContext()).newClient()
     .register(LoggingFilter.class)
     .target("http://testhost.domain.org:9080/rest.webapp/api/v1/hello/")
     .property(ClientProperties.FOLLOW_REDIRECTS, Boolean.TRUE)
     .request().get();   
 Assertions.assertThat(response.getStatus()).isNotEqualTo(302);

クライアントがリダイレクトに従わないように見えるため、これは失敗します。ロギングフィルターが提供するものは次のとおりです。

Feb 14, 2014 12:23:45 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 1 * Sending client request on thread main
1 > GET http://testhost.domain.org:9080/rest.webapp/api/v1/hello/

Feb 14, 2014 12:23:45 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 1 * Client response received on thread main
1 < 302
1 < Cache-Control: private
1 < Content-Length: 0
1 < Date: Fri, 14 Feb 2014 11:38:59 GMT
1 < Expires: Thu, 01 Jan 1970 01:00:00 CET
1 < Location: https://testhost.domain.org:9443/rest.webapp/api/v1/hello/
1 < Server: Apache-Coyote/1.1

ジャージのドキュメントから、ClientProperties.FOLLOW_REDIRECTSプロパティをクライアントに追加するだけでよいことがわかりましたが、これは明らかにそうではありません。クライアント側のフィルターが必要であることを示すメッセージも見つかりました。リダイレクトに従いますが、これに関する例やガイドラインは見つかりませんでした。

したがって、jax.rsとリダイレクトの経験がある人が、方向/ドキュメント/サンプルコードを教えてくれるとしたら、本当にありがたいです。

13
devlearn

これを行う正しい方法は次のとおりです。

webTarget.property(ClientProperties.FOLLOW_REDIRECTS, Boolean.TRUE);
11
Nitin

さて、私はついにフィルターを使用してこれを理解しました、これが最良の解決策であるかどうかはわかりません、コメントは大歓迎です:

public class FollowRedirectFilter implements ClientResponseFilter
{
   @Override
   public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException
   {
      if (responseContext.getStatusInfo().getFamily() != Response.Status.Family.REDIRECTION)
         return;

      Response resp = requestContext.getClient().target(responseContext.getLocation()).request().method(requestContext.getMethod());

      responseContext.setEntityStream((InputStream) resp.getEntity());
      responseContext.setStatusInfo(resp.getStatusInfo());
      responseContext.setStatus(resp.getStatus());
   }
}
9
devlearn

これは、リダイレクト中にURLスキームが変更された場合、Http(s)UrlConnectionがリダイレクトに従わないために発生します(たとえば、 HTTPURLConnectionがHTTPからHTTPSへのリダイレクトに従わない を参照)。したがって、考えられる解決策は 代替クライアントトランスポートコネクタを使用 です。

これは次のようになります

SSLContextProvider ssl = new TrustAllSSLContextImpl(); // just trust all certs

JerseyClientBuilder clientBuilder = new JerseyClientBuilder()
 .sslContext(ssl.getContext())
 .register(LoggingFilter.class);
clientBuilder.getConfiguration().connectorProvider(new org.glassfish.jersey.Apache.connector.ApacheConnectorProvider());

JerseyClient client = clientBuilder.build();

Response response = client    
 .target("http://testhost.domain.org:9080/rest.webapp/api/v1/hello/")
 .property(ClientProperties.FOLLOW_REDIRECTS, Boolean.TRUE)
 .request().get();
Assertions.assertThat(response.getStatus()).isNotEqualTo(302);
2
Maxim Mazin