最近在使用Apache HttpClient4.x時(shí)發(fā)現(xiàn)如果出現(xiàn)循環(huán)重定向的話就會(huì)出現(xiàn)bug問題了,這樣導(dǎo)致服務(wù)器無法正常訪問,會(huì)一直跳來跳去了,下面我來給大家介紹解決此問題的方法.
在Apache HttpClient 4.0里有個(gè)循環(huán)重定向的bug,當(dāng)服務(wù)器試圖正常的從域名A跳轉(zhuǎn)到B的時(shí)候就會(huì)發(fā)生,我是在 Vevb.com 跳 www.survivalescaperooms.com 的時(shí)候發(fā)現(xiàn)的,換過最新版也發(fā)現(xiàn)還是有這個(gè)問題.
跟蹤了DefaultRequestDirector.java之后發(fā)現(xiàn),它在內(nèi)部創(chuàng)建了一個(gè)HttpRedirect對象來處理重定向,這個(gè)對象會(huì)重用你之前的HttpGet對象里的HTTP 頭,導(dǎo)致這個(gè)bug的根源在于,連Host頭也用了,這表示重定向到的新域名如果和老域名如果是同一組集群,那么服務(wù)器會(huì)試圖重新發(fā)一個(gè)重定向請求,這樣就造成了HttpClient拋出CircularRedirectException.
我是派生了DefaultRequestDirector類來改掉這個(gè)問題,代碼如下:
- public class RedirectRequestDirector extends DefaultRequestDirector
- {
- RedirectRequestDirector(
- final HttpRequestExecutor requestExec,
- final ClientConnectionManager conman,
- final ConnectionReuseStrategy reustrat,
- final ConnectionKeepAliveStrategy kastrat,
- final HttpRoutePlanner rouplan,
- final HttpProcessor httpProcessor,
- final HttpRequestRetryHandler retryHandler,
- final RedirectHandler redirectHandler,
- final AuthenticationHandler targetAuthHandler,
- final AuthenticationHandler proxyAuthHandler,
- final UserTokenHandler userTokenHandler,
- final HttpParams params)
- {
- super(requestExec, conman, reustrat, kastrat, rouplan, httpProcessor, retryHandler, redirectHandler, targetAuthHandler, proxyAuthHandler, userTokenHandler, params);
- }
- @Override
- protected RoutedRequest handleResponse(RoutedRequest roureq,
- HttpResponse response,
- HttpContext context)
- throws HttpException, IOException
- {
- RoutedRequest req = super.handleResponse(roureq, response, context);
- if(req != null)
- {
- String redirectTarget = req.getRoute().getTargetHost().getHostName();
- req.getRequest().getOriginal().setHeader("Host", redirectTarget);//開源代碼Vevb.com
- }
- return req;
- }
- }
這里修改了Host頭為試圖重定向的主機(jī)名,還需要修改 DefaultHttpClient,代碼如下:
- public class RedirectHttpClient extends DefaultHttpClient
- {
- @Override
- protected RequestDirector createClientRequestDirector(
- final HttpRequestExecutor requestExec,
- final ClientConnectionManager conman,
- final ConnectionReuseStrategy reustrat,
- final ConnectionKeepAliveStrategy kastrat,
- final HttpRoutePlanner rouplan,
- final HttpProcessor httpProcessor,
- final HttpRequestRetryHandler retryHandler,
- final RedirectHandler redirectHandler,
- final AuthenticationHandler targetAuthHandler,
- final AuthenticationHandler proxyAuthHandler,
- final UserTokenHandler stateHandler,
- final HttpParams params) {
- return new RedirectRequestDirector(
- requestExec,
- conman,
- reustrat,
- kastrat,
- rouplan,
- httpProcessor,
- retryHandler,
- redirectHandler,
- targetAuthHandler,
- proxyAuthHandler,
- stateHandler,
- params);
- }
- }
現(xiàn)在就能正常處理跳轉(zhuǎn)了.
新聞熱點(diǎn)
疑難解答
圖片精選