我正在尝试让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。
在这种情况下是否有可能让重定向正常工作?谢谢!
答案 0 :(得分:3)
经过一些调查后,我发现Jersey Client
不对此问题负责。如果响应的HttpURLConnection
标头具有另一个方案而不是原始URL,则它是一般的Java Location
行为(或更好地说安全限制)。
因此,如果请求以某种方式(响应代码3xx)重定向到具有其他方案的资源,HttpURLConnection
将忽略followRedirects
标志并返回适当的响应代码。否则,如果followRedirects=true
,它会向建议的URL发送后续请求并返回该资源的响应。