1. 程式人生 > >關於webview儲存cookie問題

關於webview儲存cookie問題

問題描述:
最近專案上需要使用webview載入一個郵件功能,登陸時候會獲取一個郵件登陸的地址,第一次開啟沒有問題,第二次開啟就提示“cookie not matched”

開始採取的措施是每次開啟URL時儲存cookie,測試時發現並沒有生效,且是概率性的;

程式碼百度上一大堆,大體思路:

  1. 在oncreate裡初始化相關引數
  2. 獲取cookie並儲存
  3. 下次進入時候解析cookie並設定cookie

然而並沒有解決cookie問題,最後沒辦法,動用抓包工具Fiddler4,從抓包工具資料看,少設定了一個cookie

原來時因為setCookie這個API一次只能新增一個cookie,多個cookie需要依次新增,至此問題解決;

下面從其他部落格轉載點寫的比較有用的內容,粘點過來:
另外附上Fiddler4簡單設定和使用

Hybrid App(混合式應用)的開發過程中少不了與WebView的互動,在涉及到賬戶體系的產品中,包含了一種登入狀態的傳遞。比如,在Native(原生)介面的登入操作,進入到Web介面時,涉及到賬戶資訊時,需要將登入狀態傳遞到Web裡面,避免使用者二次登入。這裡就涉及到WebView載入網頁時的Cookie操作了。

通常我們在登入時獲取到使用者的Cookie和Token資訊,然後將其儲存到sdcard的WebView快取檔案當中,這樣在載入網頁時,WebView會自動將當前url的本地Cookie資訊放在http請求的request中,傳遞給伺服器。

流程如下:
1、Android客戶端給WebView設定Cookie的程式碼如下:

    public boolean syncCookie() {
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setCookie(url, "cookie的值");
        cookieManager.setCookie(url, "cookie的值");
        String newCookie = cookieManager.getCookie(url);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(context); cookieSyncManager.sync(); } return TextUtils.isEmpty(newCookie) ? false : true; }

注意事項:

  1. Cookie設定必須放在WevSettings設定和webView.loadUrl()方法之前;
  2. 當Cookie包含了多個鍵值對資訊時,需要多次呼叫setCookie方法,而不是使用下面這種新增分號的形式拼接字串:
website_name=782; website_token=8f47c21816cb596c93b97d64adb7eb9b; JSESSIONID=4315103E6AB51DE5BA3D910772735D1C; website_name=782; website_token=294539a5631280a2cdbf99f0e906dc21; 
  1. 在API 21之後,WebView實現了自動同步Cookie,不需要手動同步,所以,使用時可以新增版本判斷;
  2. 實際使用過程中,我在展示Web的Activity中通過多次呼叫setCookie的方法設定Cookie,通過Native介面多次進入Web頁面,發現loadUrl時,Cookie值存在重複,比如:
    第一次進入Web:
website_name=782; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; app_uid=782; website_source=apk; app_login_flag=1

第二次進入Web:

website_name=782; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; app_uid=782; website_source=apk; app_login_flag=1; JSESSIONID=4C17030F8E622F18DCDDA8B58EE7AB3D; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; website_name=782

出現問題:Set-Value存在重複,這樣導致,如果切換賬號進入Web,會出現資料錯亂的情景,所以,如果採用在展示Web的Activity中設定Cookie的方式,需在onDestroy方法中清除Cookie。

  1. 可以使用WebSetting新增userAgent,方便前端網頁判斷請求來源,如:
WebSettings settings = webView.getSettings();  
String ua = settings.getUserAgentString();  
settings.setUserAgentString(ua + "; android_app/1.0.0");  

2、CookieManager會將這個Cookie存入該應用程式/data/data/databases/目錄下的webviewCookiesChromium.db資料庫的cookies表中
3、開啟網頁,WebView從資料庫中讀取該cookie值,放到http請求的頭部,傳遞到伺服器
4、客戶端可以在登出登入時清除該應用程式用到的所有cookies,避免切換賬號等操作情景產生快取問題。

cookieManager.removeAllCookie();  

補充:WebView獲取載入網頁的cookie:

private class MyWebViewClient extends WebViewClient {

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            webview.loadUrl(url);
            return true;
        }

        public void onPageFinished(WebView view, String url) {
            CookieManager cookieManager = CookieManager.getInstance();
            String CookieStr = cookieManager.getCookie(url);
            super.onPageFinished(view, url);
        }

    } 

Fiddler4簡單設定和使用

1 . 首先,確保安裝 Fiddler 的電腦和你的手機在同一區域網內(如果電腦有線連線和WIFI不是區域網,就用手機連WIFI,然後把手機通過USB共享網路給電腦,這樣電腦也能聯網了),因為Fiddler只是一個代理,需要將手機的代理指向 PC 機,不能互相訪問是不行的。
2. 開啟Fiddler的遠端連線,Fiddler 主選單 Tools -> Fiddler Options…-> Connections頁籤,選中Allowremote computers to connect。效果圖如下:
這裡寫圖片描述
3. 開啟好遠端連線之後,重啟Fiddler,不然就不會更新你剛開啟的遠端配置
4. 下面開始設定手機端了,獲取PC的IP地址,我的IP地址是:192.168.1.123
5. 開啟你的手機設定介面:
這裡寫圖片描述
6.這裡就可以抓包了

相關推薦

關於webview儲存cookie問題

問題描述: 最近專案上需要使用webview載入一個郵件功能,登陸時候會獲取一個郵件登陸的地址,第一次開啟沒有問題,第二次開啟就提示“cookie not matched” 開始採取的措施是每次開啟URL時儲存cookie,測試時發現並沒有生效,且是概率性的

關於Android使用Xutils的WebView儲存Cookie登入

/** * Sync Cookie */ private void syncCookie(Context context, String url){ try{ Log.d("Nat: webView.syncCookie.url", url);

android webview 儲存cookie

在用webview登陸某網站web客戶端時,需要儲存cookie,這樣退出再進入時就不用二次登陸,android使用webview解決Cookie問題的方法是———————————————— public class WebClientActivity extends Ac

Python3 Post登入並且儲存cookie登入其他頁面

import urllib.request import sys import http.cookiejar import urllib.parse from bs4 import BeautifulSoup import codecs import re #登入頁面 url = "h

python cookiejar儲存cookie資訊

cookie資訊是什麼? cookie, 某些網站為了辨別使用者身份, 只有登陸之後才能訪問某個頁面; 進行一個會話跟蹤, 將使用者的相關資訊包括使用者名稱等儲存到本地終端 from http import cookiejar from urllib.request import

Android webview設定cookiecookie丟失問題

Android頁面嵌套了一個h5,H5頁面內部有使用者登陸頁面,發現h5頁面的登陸功能無法使用,一直登陸失敗。和web那邊商量一會,發現js寫入的cookie丟失了。所有需要Android這邊在重寫寫入一次。 mWebView = view.findViewById(R

前端儲存-cookie-sessionStorage-loacalStorage

0. cookie h5之前,儲存主要是用cookies。cookies缺點有在請求頭上帶著資料,大小是4k之內。主Domain汙染。 主要應用:購物車、客戶登入 對於IE瀏覽器有UserData,大小是64k,只有IE瀏覽器支援。

HTML5中本地儲存cookie、sessionStorage、localStorage的區別

1、sessionStorage 適用於長期儲存資料,瀏覽器關閉後資料不丟失。 sessionStorage 用於在本地儲存一個會話(session)中的資料,這些資料只有在同一個會話中的頁面才能訪問並且當會話結束後資料也隨之銷燬。因此sessionStorage 不是一個持久化的本地儲存,

android中okhttp與webviewcookie共享

轉載請註明出處:https://blog.csdn.net/u011038298/article/details/84551136   1.在WebView中同步cookie import android.os.Build; import android.text.Text

python webdriver 儲存COOKIE 並使用COOKIE 跳過登入

from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from selenium.webdriver.common.by import By from s

WebViewCookie跨域問題

案例 前幾天遇到這樣一個問題:前端開發了一個h5頁面,在webView中載入時,發現獲取不到 設定的cookie資訊.原以為是沒設定好,將支援的一級域名梳理了一遍,迴圈設定;其次客戶端自己測試,通過getCookie(url)能正常獲取,但是抓包發現頁面網路請求的cookie中並沒有資料,一

Asp.Net Core 2.1 儲存Cookie的3種方法

Asp.Net Core 2.1生成的專案模板預設實現了《歐洲常規資料保護法規 (GDPR)》支援。這就使得我們的程式要想成功的儲存除了使用者身份以外的cookie通常是需要使用者同意的。     這裡提供筆者已知的3種儲存cookie的方法:     1.在Startu

本地儲存(cookie\localStorage\sessionStorage)

cookie: 始終在同源http中攜帶(及時不需要),即在瀏覽器與伺服器之間來回傳遞,也因此而造成一定的寬頻浪費。 有保質期,在有效期前一直有效。 儲存資料不超過4K,適用於會話標記, 在同源同

IE瀏覽器下使用localhost域名儲存cookie的問題

最近在做一個新專案,發現在IE瀏覽器下無法單點登入,經過原始碼檢視追蹤,發現如下程式碼問題 SessionConfig.java private Integer redisExpireTime = 60 * 60 * 24 * 7; privat

Android AsyncHttpClient登入儲存cookie和讀寫cookie

AsyncHttpClient有個特性:(11)持久化cookie儲存,可以將cookie儲存到你的應用程式的SharedPreferences中AsyncHttpClient Cookie相關的官方的文件This library also includes a Persis

Android WebViewcookie第一次載入不工作的問題的解決

 今天遇到一個問題,在使用WebView載入一個網頁時,當用戶點選一個需要登陸的按鈕時,就跳到自己做的登入頁面,登陸成功以後,就同步WebView,相當於WebView也登入了,但是,等登陸成功以後,重新載入頁面發現還是沒有登陸,要退出這個activity再進入才顯示已經

Android WebView獲取cookie

重寫WebViewClient方法 public class MyWebViewClient extends WebViewClient { public boolean shouldOv

Android使用Asynchronous Http Client完成登入儲存cookie的問題

Persistent Cookie Storage with PersistentCookieStore  This library also includes a PersistentCookieStore which is an implementation of the Apache HttpClie

【Android】WebView設定Cookie

在網上搜索給WebView設定Cookie這個問題得到的回答都是以下這段程式碼: CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.

android webview 設定 Cookie

   一般用webview的時候都不會考慮Cookie問題,但是某些需求考慮到使用者登入問題,所以就得考慮給webview設定Cookie.    我用的實現方式是將Cookie存放到 HashMap 並 儲存到 SharedPreferences,然後再需要使用到的地方取出來使用 //儲存C