2011-09-14 89 views
1

我使用Apache HttpComponents(核心 - 4.1.3,httpclient 4.1.1)在我寫的REST客戶端中發出http請求。網絡服務需要使用路標實現的OAuth。最近,web服務已經將301重定向引入了也需要oauth的端點。所以,我已經實現了一個自定義的RedirectStrategy,它構建了一個新的請求並使用路標對其進行簽名,就像我通常做的那樣。但是,在我返回新請求之後,前兩行(位於DefaultRequestDirector)將所有標題設置爲初始請求中發送的所有標題,有效地擦除了我的新授權標頭並導致所有重定向請求失敗。使用Apache HttpComponents重定向的標題

有沒有人知道解決這個問題的方法?我認爲在我的自定義RedirectStrategy中總是返回false,並將其附加到我已附加到我的請求中的ResponseHandler中,但重構請求並通過正確的客戶端提交它的方法並不重要。

這些都是在它調用我的自定義RedirectStrategy的DefaultRequestDirector線1021年至1023年,然後抹我的頭(我會嘗試鏈接到源,不久):

HttpUriRequest redirect = redirectStrategy.getRedirect(request, response, context); 
HttpRequest orig = request.getOriginal(); 
redirect.setHeaders(orig.getAllHeaders()); 

回答

2

我猜一個如果你所指的代碼是行349 of DefaultRequestDirector,那麼在452行的下一個位置有一個呼叫requestExec.preProcess(wrapper, httpProcessor, context)

是否有可能在此註冊處理器來簽署請求?

如果不是,BasicHttpProcessor(可能是此處使用的處理器)允許您註冊攔截器,以允許您參與預處理請求。

這可能是簽署請求的另一個選項。

或者,有一個HttpContext對象。這個對象的Javadoc表明它可以用來保存請求的上下文數據,並且你的數據將符合這個描述。因此,將它停放在那裏,並在以後需要時再進行回收。

+0

Paul,謝謝你的回答。不幸的是,我花了一些時間試圖實現一個RequestInterceptor,並且在請求到達那裏時,該路標用於簽署請求的URI已經被剝離到了它期望完全限定的URI之後的域。我想我可以製作截取請求的副本(使用完整的URI),然後將授權標頭複製到截取的請求中。不過,我擔心的是性能問題。另外,這看起來真的很黑。 –

+1

是的,你可能無法把它放在請求本身,你可能不得不把它放在一邊,然後再應用。有一個HttpContext對象,是不是它在那裏? Javadoc似乎建議如此 - https://svn.apache.org/repos/asf/httpcomponents/httpcore/tags/4.1.3/httpcore/src/main/java/org/apache/http/protocol/HttpContext.java 。 –

+0

太棒了!爲什麼我沒有想到這個?你可以編輯你的答案並添加此評論,以便我可以將其標記爲已解決?非常感謝! –