国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > Apache > 正文

Apache HttpClient中循環(huán)重定向的bug詳解

2024-08-27 18:22:34
字體:
供稿:網(wǎng)友

最近在使用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è)問題,代碼如下:

  1. public class RedirectRequestDirector extends DefaultRequestDirector 
  2.     RedirectRequestDirector( 
  3.             final HttpRequestExecutor requestExec, 
  4.             final ClientConnectionManager conman, 
  5.             final ConnectionReuseStrategy reustrat, 
  6.             final ConnectionKeepAliveStrategy kastrat, 
  7.             final HttpRoutePlanner rouplan, 
  8.             final HttpProcessor httpProcessor, 
  9.             final HttpRequestRetryHandler retryHandler, 
  10.             final RedirectHandler redirectHandler, 
  11.             final AuthenticationHandler targetAuthHandler, 
  12.             final AuthenticationHandler proxyAuthHandler, 
  13.             final UserTokenHandler userTokenHandler, 
  14.             final HttpParams params)  
  15.     { 
  16.         super(requestExec, conman, reustrat, kastrat, rouplan, httpProcessor, retryHandler, redirectHandler, targetAuthHandler, proxyAuthHandler, userTokenHandler, params); 
  17.  
  18.     } 
  19.     @Override 
  20.     protected RoutedRequest handleResponse(RoutedRequest roureq, 
  21.             HttpResponse response, 
  22.             HttpContext context) 
  23.                     throws HttpException, IOException 
  24.     { 
  25.         RoutedRequest req = super.handleResponse(roureq, response, context); 
  26.         if(req != null) 
  27.         { 
  28.             String redirectTarget = req.getRoute().getTargetHost().getHostName(); 
  29.             req.getRequest().getOriginal().setHeader("Host", redirectTarget);//開源代碼Vevb.com 
  30.         } 
  31.         return req; 
  32.     } 
  33.  

這里修改了Host頭為試圖重定向的主機(jī)名,還需要修改 DefaultHttpClient,代碼如下:

  1. public class RedirectHttpClient extends DefaultHttpClient 
  2.     @Override 
  3.     protected RequestDirector createClientRequestDirector( 
  4.             final HttpRequestExecutor requestExec, 
  5.             final ClientConnectionManager conman, 
  6.             final ConnectionReuseStrategy reustrat, 
  7.             final ConnectionKeepAliveStrategy kastrat, 
  8.             final HttpRoutePlanner rouplan, 
  9.             final HttpProcessor httpProcessor, 
  10.             final HttpRequestRetryHandler retryHandler, 
  11.             final RedirectHandler redirectHandler, 
  12.             final AuthenticationHandler targetAuthHandler, 
  13.             final AuthenticationHandler proxyAuthHandler, 
  14.             final UserTokenHandler stateHandler, 
  15.             final HttpParams params) { 
  16.         return new RedirectRequestDirector( 
  17.                 requestExec, 
  18.                 conman, 
  19.                 reustrat, 
  20.                 kastrat, 
  21.                 rouplan, 
  22.                 httpProcessor, 
  23.                 retryHandler, 
  24.                 redirectHandler, 
  25.                 targetAuthHandler, 
  26.                 proxyAuthHandler, 
  27.                 stateHandler, 
  28.                 params); 
  29.     } 

現(xiàn)在就能正常處理跳轉(zhuǎn)了.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 靖边县| 永年县| 昌宁县| 平定县| 沂源县| 湖南省| 横峰县| 营山县| 三江| 渑池县| 武义县| 长寿区| 通河县| 中方县| 台南县| 盐池县| 宁津县| 崇明县| 成武县| 百色市| 噶尔县| 衡阳县| 绥江县| 平顶山市| 榆中县| 衡水市| 休宁县| 比如县| 衡南县| 通海县| 岑巩县| 英超| 赣州市| 化州市| 定结县| 永德县| 海丰县| 滨州市| 从江县| 雷州市| 乌拉特中旗|