2015-05-12 27 views
2

我正試圖讓自主尋途在Jersey客戶端2.0中工作。這裏是我的代碼:JAXRS 2.0客戶端:FOLLOW_REDIRECTS屬性不起作用

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

服務器按照預期發送HTTP 302與位置標題中的另一個URL。我假設根據Jersey JAXRS Client API客戶端將自動重定向到新的指定的URL,但我得到一個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> 

因此,客戶端從http:// localhost:8080/some_path由servlet容器自動重定向到https:// localhost:8181/another_path。 在瀏覽器中它工作正常,但Jersey客戶端似乎忽略FOLLOW_REDIRECTS屬性,而是拋出一個RedirectionException。

在這種情況下是否有機會重定向正常工作?謝謝!

+0

你用FOLLOW_REDIRECTS嘗試了嗎? –

+0

是的,你應該有:ClientConfig cc = new ClientConfig()。property(ClientProperties.FOLLOW_REDIRECTS,true); – jeorfevre

+0

謝謝,糾正!我玩過所有可能的配置變體,並且「錯誤」值被錯誤地複製粘貼。實際上,將FOLLOW_REDIRECTS屬性設置爲值「true」沒有任何區別。 – olexd

回答

3

經過一番調查後我發現Jersey Client不對此問題負責。它的一般Java HttpURLConnection行爲(或更好地說安全限制),如果Location響應的頭部有一些另外的方案,而不是起始URL。

因此,如果請求以某種方式(響應代碼3xx)重定向到其他方案的資源,HttpURLConnection將忽略followRedirects標誌並返回相應的響應代碼。否則,如果followRedirects=true,它發送後續請求到建議的URL並返回來自該資源的響應。

有關更多信息,請參閱Java doesn't follow redirect in URLConnection