JAXRS 2.0客户端:FOLLOW_REDIRECTS属性不起作用

时间:2015-05-12 16:00:10

标签: java rest jax-rs jersey-client

我正在尝试让autoredirects在Jersey Client 2.0中运行。这是我的代码:

ClientConfig cc = new ClientConfig().property(ClientProperties.FOLLOW_REDIRECTS, true);
Client c = ClientBuilder.newClient(cc);
WebTarget wt = c.target("some_path");
SystemInfo info = wt.request(MediaType.APPLICATION_XML_TYPE).get(SystemInfo.class);

服务器按预期在位置标头中发送带有另一个URL的HTTP 302。我假设根据Jersey JAXRS Client API,客户端会自动重定向到新指定的网址,但我得到的是RedirectionException

这是适当的行为吗?如何在没有在try-catch-block中手动实现重定向的情况下使客户端重定向工作?

提前致谢!

更新:

我发现问题出在奇怪的行为上。如果在服务器上以编程方式进行重定向,例如:

return Response.seeOther(another_uri).build();
一切都很好。但就我而言,由于部署描述符中的security-constraint元素而进行了重定向:

<security-constraint>
    ...
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

因此,客户端由servlet容器自动从http:// localhost:8080/some_path重定向到https:// localhost:8181/another_path。 在浏览器中它可以正常工作,但Jersey客户端似乎忽略了FOLLOW_REDIRECTS属性并引发了RedirectionException。

在这种情况下是否有可能让重定向正常工作?谢谢!

1 个答案:

答案 0 :(得分:3)

经过一些调查后,我发现Jersey Client不对此问题负责。如果响应的HttpURLConnection标头具有另一个方案而不是原始URL,则它是一般的Java Location行为(或更好地说安全限制)。

因此,如果请求以某种方式(响应代码3xx)重定向到具有其他方案的资源,HttpURLConnection将忽略followRedirects标志并返回适当的响应代码。否则,如果followRedirects=true,它会向建议的URL发送后续请求并返回该资源的响应。

有关详细信息,请参阅Java doesn't follow redirect in URLConnection