天天看點

AsyncHttpClient 中的重定向和 setEnableRedirects 方法異常解決

今天使用 asynchttpclient  開源庫,遇到個很崩潰的問題:

方法  setenableredirects(false); 從名稱上看應該是重定向開關的方法,設定為 false 後則普通請求正常,但是遇到重定向則停止請求,還算正常(文章末尾會談到這裡會遇到另一個 bug 的情況)

但當設定為  setenableredirects(true);  按理說應該是對于 301、302 重定向将進行跟随重定向進行請求的,但卻出現各種異常和亂七八糟的問題,不論是普通請求還是重定向的請求全是 clientprotocolexception、 circularredirectexception 等異常,有時還不停的 gc 

類似:

AsyncHttpClient 中的重定向和 setEnableRedirects 方法異常解決

各種調試,弄了大半天才終于搞定是怎麼回事!

我覺得 asynchttpclient 開源庫中的源碼 setenableredirects 方法有問題,看了下源碼:

似乎設定為 setenableredirects 為 true 後,所有請求包括 http 200 都會 isredirectrequested 方法都會傳回 true 标記為重定向導緻所有請求全部都出現問題,

于是建立個類繼承 asynchttpclient 後重寫了他的 setenableredirects 方法,隻對 301和 302進行重定向傳回設定的 boolean 值,這下測試就 ok 了,普通請求正常,重定向則自動重定向請求到資料了,跟預想的結果一樣了:

修改後的代碼:

這樣當 設定為 false 時則全部狀态都傳回 false,設定為true 時則僅對 301、302 才傳回 true,其餘都傳回 false

同時還要配置下面的參數設定:

允許環形重定向和設定重定向最大次數。

asynchttpclient 中的重定向和 setenableredirects 方法異常解決

下面還有個重要提示:

經過我多次的測試實驗,發現:

其實系統預設應該是允許請求重定向的,但這裡有個 bug,就是如果你有兩個請求是相同的連結位址,則隻有第一個請求會被重定向,第二個則不會,将直接出現最上面的那一堆堆的異常資訊。

解決辦法:

很簡單,就是上面提到的 環形重定向的參數設定了,加上就好了。

這裡還要強調一點就是如果你不複寫 setenableredirects 方法的話,那麼最好千萬不要調用他,一旦調用他就會重置 handle 導緻出現前面說到的各種問題,

僅在需要禁止重定向的時候調用該方法設定為 false

血淚教訓啊,浪費了一天的青春,感歎下其實很多技術部落格裡的文章,并不是你看到的簡簡單單的一個個字元,背後都是無數程式猿們的血淚和無悔青春,用生命的代價換來的。

繼續閱讀