2015-04-29 65 views
3

我正在連接到首先進入身份驗證登錄頁面然後重定向的服務器。澤西島未遵循302重定向

ClientConfig config = new DefaultClientConfig(); 
config.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true); 
Client client = Client.create(config); 
client.setFollowRedirects(true); 
WebResource service = client.resource(UriBuilder.fromUri(url).build()); 

String output = service.path(resource) 
     .path(model) 
     .path(id) 
     .accept(MediaType.APPLICATION_JSON) 
     .get(String.class); 

這被拋出異常:

在異常線程 「ThreadJob」 com.sun.jersey.api.client.UniformInterfaceException:GET https://url 返回的302響應狀態在實測值 com.sun.jersey.api.client.WebResource.handle(WebResource.java:688) at com.sun.jersey.api.client.WebResource.access $ 200(WebResource.java:74) at com.sun.jersey .api.client.WebResource $ Builder.get(WebResource.java:509)

新澤西版本1.19

+0

夫婦的選擇,試圖在這裏http://stackoverflow.com/questions/21778393/jersey-jax-rs-client-2-5-follow-redirect – stringy05

+1

你也使用哪種版本的球衣以及哪個http連接器? – stringy05

+0

我使用球衣1.19。我不知道什麼是httpconnector。這段代碼是我球衣的完整代碼,我沒有明確導入任何httpconnector –

回答

4

我發現經常吮吸新澤西州。你幾乎會認爲他們意味着你要做這樣的事情,他們添加「followRedirect」選項來簡單地混淆用戶。

import static org.junit.Assert.*; 

import java.util.logging.Logger; 

import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.UriBuilder; 

import org.junit.Test; 

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.UniformInterfaceException; 
import com.sun.jersey.api.client.WebResource; 
import com.sun.jersey.api.client.config.ClientConfig; 
import com.sun.jersey.api.client.config.DefaultClientConfig; 
import com.sun.jersey.api.client.filter.ClientFilter; 
import com.sun.jersey.api.client.filter.LoggingFilter; 


public class TestJerseyRedirect { 

    @Test 
    public void test() { 
     ClientConfig config = new DefaultClientConfig(); 
     config.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true); 
     com.sun.jersey.api.client.Client client = Client.create(config); 
     client.setFollowRedirects(true); 

     LoggingFilter logging = new LoggingFilter(Logger.getAnonymousLogger()); 


     WebResource service = client.resource(UriBuilder.fromUri("http://mail.google.com").build()); 
     service.addFilter(logging); 
     try { 
      String output = service.path("mail") 
       .accept(MediaType.TEXT_HTML) 
       .get(String.class); 

      System.out.println(output); 

     } catch (UniformInterfaceException e) { 

      if (e.getResponse().getStatus() == 302) { 
       String location = e.getResponse().getHeaders().getFirst("Location"); 

       WebResource service2 = client.resource(UriBuilder.fromUri(location).build()); 
       service2.addFilter(logging); 
       String output2 = service2 
         .accept(MediaType.TEXT_HTML) 
         .get(String.class); 

        System.out.println(output2); 

      } 
      else { 
       e.printStackTrace(); 
       throw e; 
      } 
     } 

    } 
} 

這將工作,但顯然不是正確的方式來做到這一點。這種情況不會那麼嚴重,但是如果存在多個重定向等,則可能會給您帶來麻煩。

@Test 
public void testGoodWay() throws Exception { 
    ClientConfig config = new DefaultClientConfig(); 
    config.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true); 
    com.sun.jersey.api.client.Client client = Client.create(config); 
    client.setFollowRedirects(true); 

    LoggingFilter logging = new LoggingFilter(Logger.getAnonymousLogger()); 



    WebResource service = client.resource(UriBuilder.fromUri("http://mail.google.com").build()); 
    service.addFilter(logging); 
    service.addFilter(new RedirectFilter()); 

    try { 
     String output = service.path("mail") 
      .accept(MediaType.TEXT_HTML) 
      .get(String.class); 

     System.out.println(output); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

class RedirectFilter extends ClientFilter { 

    @Override 
    public ClientResponse handle(ClientRequest cr) throws ClientHandlerException { 
     ClientHandler ch = getNext(); 
     ClientResponse resp = ch.handle(cr); 

     if (resp.getClientResponseStatus().getFamily() != Response.Status.Family.REDIRECTION) { 
      return resp; 
     } 
     else { 
      // try location 
      String redirectTarget = resp.getHeaders().getFirst("Location"); 
      cr.setURI(UriBuilder.fromUri(redirectTarget).build()); 
      return ch.handle(cr); 
     } 

    } 

} 
+0

非常感謝!我只是稍微修改了一下以使其工作:我將'if(resp.getStatusInfo()。getFamily()!= Response.Status.Family.REDIRECTION)'改爲'if(resp.getClientResponseStatus()。getFamily() != Response.Status.Family.REDIRECTION)'。 – L42

+1

謝謝,我用你的代碼修復了答案:) – stringy05

0

改變你conectorProvider爲ApacheConnectorProvider()和屬性FOLLOW_REDIRECTS真正的。 例子:

 ClientConfig clientConfig = new ClientConfig(); 
     clientConfig.connectorProvider(new ApacheConnectorProvider()); 
     client = ClientBuilder.newClient(clientConfig); 
     Response response = client.target("YOUR_URL") 
       .property(ClientProperties.FOLLOW_REDIRECTS, true)** 
       .request() 
       .get(); 

文件:https://jersey.java.net/documentation/latest/client.html#d0e4895