2014-02-14 14 views
10

Ich habe ein Setup, wo Tomcat-Server Hosting meiner REST-Server Anrufe von HTTP (Port 9080) zu HTTPS (Port 9443) umleitet.Jersey jax.rs Client 2.5 folgen Redirect

Ich benutze Jersey 2.5 Implementierung und kann nicht die Clients konfigurieren, um Weiterleitungen zu folgen.

Ich habe diese Frage SO gefunden (Jersey client doesn't follow redirects), aber es ist für Jersey 1.X-Serie zur Verfügung gestellt und die API hat sich geändert.

Ich habe versucht, es für 2.5 mit dem folgenden Testcode anzupassen:

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

, die als der Client den folgenden Umleitungen nicht versagt zu sein scheint. Hier ist, was die Protokollierung Filter bieten:

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 

Aus dem Trikot doc Es verstand, dass alles, was getan werden muss, ist das ClientProperties.FOLLOW_REDIRECTS Eigentum an den Client hinzufügen, aber dies offensichtlich nicht der case.I zu sein habe auch Nachrichten gefunden, die anzeigen, dass möglicherweise ein clientseitiger Filter den Umleitungen folgen muss, aber keine Beispiele oder Richtlinien dazu gefunden hat.

Also wenn jemand etwas Erfahrung mit jax.rs und Umleitung könnte mich auf einige Richtungen/docs/Beispiel-Code zeigen würde ich wirklich zu schätzen wissen.

Antwort

6

Nun habe ich endlich diese mit einem Filter herausgefunden, nicht sicher, ob dies die beste Lösung ist, sind keine Kommentare geschätzt:

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()); 
    } 
} 
+0

ich eine Antwort hier http://stackoverflow.com/questions/1884230/urlconnection-doesnt-follow-redirect gefunden: es von http auf https umgeleitet für nicht funktioniert sicherheits Gründe. –

8

richtigen Weg, dies zu tun ist:

webTarget.property(ClientProperties.FOLLOW_REDIRECTS, Boolean.TRUE); 
+5

Sind Sie sicher, dass der letzte Parameter "falsch" ist? Scheint mir, dass dies einfach die Umleitung deaktiviert :) – devlearn

+4

Dies sollte "webTarget.property (ClientProperties.FOLLOW_REDIRECTS, Boolean.TRUE)" sein, wie der vorherige Kommentar bemerkt. –

+0

Dies funktioniert nur für Jersey; ClientProperties ist eine Jersey-Klasse. JAX-RS spezifiziert noch keine Redirect-Handling-Optionen –

1

Dies geschieht weil Http (s) UrlConnection der Weiterleitung nicht folgt, wenn sich das URL-Schema während der Weiterleitung ändert. Die mögliche Lösung ist also use alternative client transport connector.

aussehen Dies könnte wie

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