安卓通過Okhttp請求拿到cookie設置給WebView

Cookie是啥

由于HTTP協(xié)議是無狀態(tài)的死讹,而服務器端的業(yè)務必須是要有狀態(tài)的站欺。Cookie誕生的最初目的是為了存儲web中的狀態(tài)信息作郭,以方便服務器端使用哨查。比如判斷用戶是否是第一次訪問網(wǎng)站逗抑。目前最新的規(guī)范是RFC 6265,它是一個由瀏覽器服務器共同協(xié)作實現(xiàn)的規(guī)范寒亥。
客戶端請求服務器之后,服務器通過Response的header攜帶Cookie,客戶端保存在本地,下次請求的時候,在客戶端request的header中攜帶這個Cookie

一個基本的Cookie結構如下

Set-Cookie: "name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure"
其中 name=value 是必選項邮府,其它都是可選項。Cookie的主要構成如下:

name: 一個唯一確定的cookie名稱溉奕。通常來講cookie的名稱是不區(qū)分大小寫的褂傀。

value:存儲在cookie中的字符串值。最好為cookie的name和value進行url編碼

domain:cookie對于哪個域是有效的加勤。所有向該域發(fā)送的請求中都會包含這個cookie信息仙辟。這個值可以包含子域(如:yq.aliyun.com)同波,也可以不包含它(如:.aliyun.com,則對于aliyun.com的所有子域都有效).

path: 表示這個cookie影響到的路徑叠国,瀏覽器跟會根據(jù)這項配置未檩,像指定域中匹配的路徑發(fā)送cookie。

expires:失效時間粟焊,表示cookie何時應該被刪除的時間戳(也就是冤狡,何時應該停止向服務器發(fā)送這個cookie)。如果不設置這個時間戳项棠,瀏覽器會在頁面關閉時即將刪除所有cookie悲雳;不過也可以自己設置刪除時間。這個值是GMT時間格式香追,如果客戶端和服務器端時間不一致合瓢,使用expires就會存在偏差。

max-age: 與expires作用相同透典,用來告訴瀏覽器此cookie多久過期(單位是秒)晴楔,而不是一個固定的時間點。正常情況下掷匠,max-age的優(yōu)先級高于expires滥崩。

HttpOnly: 告知瀏覽器不允許通過腳本document.cookie去更改這個值,同樣這個值在document.cookie中也不可見讹语。但在http請求張仍然會攜帶這個cookie钙皮。注意這個值雖然在腳本中不可獲取,但仍然在瀏覽器安裝目錄中以文件形式存在顽决。這項設置通常在服務器端設置短条。
secure: 安全標志,指定后才菠,只有在使用SSL鏈接時候才能發(fā)送到服務器茸时,如果是http鏈接則不會傳遞該信息。就算設置了secure 屬性也并不代表他人不能看到你機器本地保存的 cookie 信息赋访,所以不要把重要信息放cookie就對了服務器端設置

如何通過攔截http請求拿到cookie

okhttp3天然支持獲取cookie
只需要實現(xiàn)CookieJar

//攔截cookie
    class LocalCookieJar implements CookieJar {
        List<Cookie> cookies;


        @Override
        public List<Cookie> loadForRequest(HttpUrl url) {
            if (cookies != null)
                return cookies;
            return new ArrayList<Cookie>();
        }

        @Override
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            this.cookies = cookies;
          //存儲當前cookie,用于webview中同步cookie
            CookiesManager.getInstance().cookieMap.put(url,cookies)
        }

    }

并在okhttp的builder中添加cooloeJar

OkHttpClient mOkHttpClient = OkHttpUtils.newInstance().connectTimeout(45, TimeUnit.SECONDS)
                .addInterceptor(new LogInterceptor())
                .cookieJar(new LocalCookieJar(cookieHashMap))//添加cookie管理
                .build();
在webview中同步cookie

以下代碼在我項目中親測有效,可能不同頁面針對cookie參數(shù)設置不同,請根據(jù)自身項目來傳所需要的cookie

webView.setWebViewClient(new CustomWebViewClient(mProgressWebView.getWebView()) {

            /**
             * 5.0以下
             */
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                synCookies(url);

                return super.shouldInterceptRequest(view, url);//將加好cookie的url傳給父類繼續(xù)執(zhí)行
            }

            /**
            *5.0以上
            */
            @SuppressLint("NewApi")
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view , WebResourceRequest request) {
                String url = request.getUrl().toString();

                synCookies(url);
                return super.shouldInterceptRequest(view, url);
            }

        });

 public static void synCookies(String url){
  if ( !TextUtils.isEmpty(url) )  
            if (!null!=cookies ) {  
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){  
                    CookieSyncManager.createInstance( context);  
                }  
                CookieManager cookieManager = CookieManager.getInstance();  
                cookieManager.setAcceptCookie( true );  
                cookieManager.removeSessionCookie();// 移除  
                cookieManager.removeAllCookie();  
                for (Cookie cookie : cookies) {
                StringBuilder sbCookie = new StringBuilder();//創(chuàng)建一個拼接cookie的容器,
                sbCookie.append(cookie.name()+"="+cookie.value());
                sbCookie.append(";domain="+cookie.domain());
                sbCookie.append(";path="+cookie.path());
                String cookieValue = sbCookie.toString();  
                cookieManager.setCookie(url, cookieValue);//為url設置cookie 
             }
                CookieSyncManager.getInstance().sync();//同步cookie  
                String newCookie = cookieManager.getCookie(url);  //這里可以查看當前設置進去的cookie
            } 
    }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末可都,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚓耽,更是在濱河造成了極大的恐慌渠牲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件步悠,死亡現(xiàn)場離奇詭異签杈,居然都是意外死亡,警方通過查閱死者的電腦和手機鼎兽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門答姥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣除,“玉大人,你說我怎么就攤上這事鹦付∩姓常” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵敲长,是天一觀的道長背苦。 經(jīng)常有香客問我,道長潘明,這世上最難降的妖魔是什么蚕键? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任拇砰,我火速辦了婚禮离熏,結果婚禮上辕翰,老公的妹妹穿的比我還像新娘切厘。我一直安慰自己募寨,他們只是感情好尚猿,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布逼蒙。 她就那樣靜靜地躺著澈蝙,像睡著了一般吓坚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灯荧,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天礁击,我揣著相機與錄音,去河邊找鬼逗载。 笑死哆窿,一個胖子當著我的面吹牛,可吹牛的內容都是我干的厉斟。 我是一名探鬼主播挚躯,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼擦秽!你這毒婦竟也來了码荔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤感挥,失蹤者是張志新(化名)和其女友劉穎缩搅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體链快,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡誉己,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了域蜗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巨双。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡噪猾,死狀恐怖,靈堂內的尸體忽然破棺而出筑累,到底是詐尸還是另有隱情袱蜡,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布慢宗,位于F島的核電站坪蚁,受9級特大地震影響,放射性物質發(fā)生泄漏镜沽。R本人自食惡果不足惜敏晤,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缅茉。 院中可真熱鬧嘴脾,春花似錦、人聲如沸蔬墩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拇颅。三九已至奏司,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間樟插,已是汗流浹背韵洋。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岸夯,地道東北人麻献。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像猜扮,于是被迫代替她去往敵國和親勉吻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • HTTP cookie(也稱為web cookie,網(wǎng)絡cookie,瀏覽器cookie或者簡稱cookie)是網(wǎng)...
    留七七閱讀 17,831評論 2 71
  • 會話(Session)跟蹤是Web程序中常用的技術旅赢,用來跟蹤用戶的整個會話齿桃。常用的會話跟蹤技術是Cookie與Se...
    chinariver閱讀 5,599評論 1 49
  • 作者:晚晴幽草軒www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饑人谷_Dylan閱讀 1,222評論 0 51
  • 背景在HTTP協(xié)議的定義中,采用了一種機制來記錄客戶端和服務器端交互的信息煮盼,這種機制被稱為cookie短纵,cooki...
    時芥藍閱讀 2,355評論 1 17
  • 1.做事的方式和速度取決于一個人思考的方式和邏輯。是節(jié)約成本還是節(jié)約時間僵控? 做事的過程可以看出一個人的格局香到,格局大...
    李娜_b39c閱讀 181評論 0 0