OKhttp 302 死循環(huán)

今天同事發(fā)給我這張圖


這里寫圖片描述

這是因?yàn)閛khttp中重定向次數(shù)超過(guò)21次以后就會(huì)報(bào)錯(cuò)。
訪問(wèn)一個(gè)接口的時(shí)候?yàn)槭裁磿?huì)重定向,我用finder抓包發(fā)現(xiàn)一切正常,是不是因?yàn)閏ookie宵凌,于是我把瀏覽器cookie一關(guān)。然后瀏覽器也不行了止后。


這里寫圖片描述

心想那簡(jiǎn)單瞎惫,給okhttp加上cookie就行了。但是新的問(wèn)題就出現(xiàn)了坯门。如下:

1.第一次打開100%出錯(cuò)
2.退出app微饥,再打開頁(yè)面可以顯示
3.用finder一抓包逗扒,就完全是好的

在接下來(lái)古戴,我發(fā)現(xiàn)訪問(wèn)接口的時(shí)候返回的302地址和接口地址的域名不一樣。例如從a.test.com->b.test.com 我看了一下CookieManger中的代碼矩肩,發(fā)現(xiàn)它管理cookie是通過(guò)host來(lái)作為key的现恼。于是我使用我自己寫的頂級(jí)域名獲取工具,實(shí)現(xiàn)了cookie的跨域傳輸黍檩。然后滿心歡喜的讓大家測(cè)試叉袍。結(jié)果并沒(méi)有什么卵用。

后來(lái)我懷疑是不是一次加載的時(shí)候CookieManager沒(méi)有完成初始化刽酱,所以沒(méi)有獲取到cookie喳逛,于是我打日志發(fā)現(xiàn)第每一次訪問(wèn)接口都是是獲取到cookie的。

實(shí)在是一籌莫展棵里,同事也不清楚這是怎么回事润文。后來(lái)我發(fā)現(xiàn)用finder抓包姐呐,抓出錯(cuò)訪問(wèn)的包,好像抓不到典蝌。我以前覺(jué)得可能是訪問(wèn)太快了曙砂。后來(lái)一想是不是根本就沒(méi)有網(wǎng)絡(luò)請(qǐng)求?

為了證實(shí)我的想法骏掀,我把httpClient.setCache()給注釋掉了鸠澈。
神奇的事情發(fā)生了。居然第一次訪問(wèn)就成功了截驮。于是我得出結(jié)論造成302死循環(huán)的就是——okhttp緩存了重定向頁(yè)面

真相只有一個(gè)那就是:

第一次訪問(wèn)A接口發(fā)生了如下情景:
    
客戶端對(duì)OkHttp說(shuō):我要A

OKhttp想了想笑陈,我這兒沒(méi)有A,于是說(shuō):我?guī)闳フ褹吧

A說(shuō):你們沒(méi)有登錄葵袭,去找B吧新锈。

OkHttp記住了:找A之前先找B。

OkHttp說(shuō):好眶熬,我去找B了妹笆。

B說(shuō):Cookie給我,我要驗(yàn)證

OkHttp急了:客戶端沒(méi)有給我Cookie呀娜氏。

B面無(wú)表情的說(shuō):我不管 拳缠,你就找A吧 ,我給你開個(gè)證明贸弥。

OkHttp就住了:找B之前要找A窟坐。

于是拿著證明去找A,但是這個(gè)時(shí)候绵疲,A已經(jīng)不是真實(shí)的A了哲鸳,而是

OkHttp記憶中的A,所以O(shè)kHttp想起了A說(shuō)的:找A之前先找B盔憨。

于是OkHttp就去找B徙菠,但是B也是記憶中的B了。而OkHttp不管郁岩,它

只知道B說(shuō)了:給了一個(gè)證明婿奔,先去找A。

于是在OKHttp在腦海中问慎,來(lái)來(lái)回回萍摊。最后人格分裂,報(bào)錯(cuò)了如叼。

最后不能因?yàn)橹囟ㄏ虺鲥e(cuò)就全盤否定OkHttp的緩存功能冰木,所以我在想是不是只要不緩存重定向結(jié)果就OK了

于是我開始Google 百度 研究OkHttp的緩存實(shí)現(xiàn)。終于功夫不負(fù)有心人,我發(fā)現(xiàn)了原來(lái)不是服務(wù)器要求我們要緩存302結(jié)果踊沸,而是我們自作聰明的把所有接口緩存了囚衔,就像這樣的誤人子弟。

這里寫圖片描述

于是我在我們模板中加了一句

這里寫圖片描述

最后源碼

  private class CacheControlInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            if (!AppUtil.getInstance().isNetworkConnected()) {
                request = request.newBuilder()
                        .cacheControl(CacheControl.FORCE_CACHE)
                        .build();
            }

            Response response = chain.proceed(request);
            if (response != null && response.isRedirect()) {
                //如果是重定向雕沿,則不做緩存
                return response;
            }


            if (AppUtil.getInstance().isNetworkConnected()) {
                int maxAge = 60; // read from cache for 1 minute
                response = response.newBuilder()
                        .removeHeader("Pragma")
                        .header("Cache-Control", "public, max-age=" + maxAge)
                        .build();
            } else {
                int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                response = response.newBuilder()
                        .removeHeader("Pragma")
                        .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                        .build();
            }
            return response;
        }
    }

于是OkHttp再也不用再自己的記憶中跑來(lái)跑去了练湿,一切又回到了原點(diǎn)。從此客戶端和服務(wù)器過(guò)上了幸福的生活审轮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肥哎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疾渣,更是在濱河造成了極大的恐慌篡诽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榴捡,死亡現(xiàn)場(chǎng)離奇詭異杈女,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吊圾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門达椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人项乒,你說(shuō)我怎么就攤上這事啰劲。” “怎么了檀何?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵蝇裤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我频鉴,道長(zhǎng)栓辜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任垛孔,我火速辦了婚禮藕甩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘似炎。我一直安慰自己辛萍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布羡藐。 她就那樣靜靜地躺著,像睡著了一般悯许。 火紅的嫁衣襯著肌膚如雪仆嗦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天先壕,我揣著相機(jī)與錄音瘩扼,去河邊找鬼谆甜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛集绰,可吹牛的內(nèi)容都是我干的规辱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼栽燕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罕袋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碍岔,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浴讯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蔼啦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榆纽,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年捏肢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奈籽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸵赫,死狀恐怖唠摹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奉瘤,我是刑警寧澤勾拉,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站盗温,受9級(jí)特大地震影響藕赞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卖局,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一斧蜕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砚偶,春花似錦批销、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至单鹿,卻和暖如春掀宋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工劲妙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湃鹊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓镣奋,卻偏偏與公主長(zhǎng)得像币呵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侨颈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容