2015-04-29 67 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