Android Cookie共用到WebView避免再次登入(保持登入狀態),androidwebview
最近在做項目時用到了webview開啟指定連結的網頁,可已經把webview設定了cookie但始終跳轉到登入頁面,這明顯是cookie沒有設定成功導致webview沒有將設定好的cookie發送出去……
| 12345 |
CookieSyncManager.createInstance(context);CookieManager cookieManager = CookieManager.getInstance();cookieManager.setAcceptCookie(true);cookieManager.setCookie(url, cookies);//cookies是在HttpClient中獲得的cookieCookieSyncManager.getInstance().sync(); |
通過上述代碼即可把事先儲存下來的cookie和指定的url關聯起來,達到保持登入的狀態,避免重複登入。遺憾的是,筆者在開發過程當中嚴格按照上述設定cookie的代碼來進行cookie的設定,可結果還是失敗,始終跳轉到登入頁提示登入。後來返回去查看了下Android API文檔,發現setCookie函數的兩個參數值說明如下:
public void setCookie(String url, String value)Added in API level 1
Sets a cookie for the given URL. Any existing cookie with the same host, path and name will be replaced with the new cookie. The cookie being set must not have expired and must not be a session cookie, otherwise it will be ignored.
| url |
the URL for which the cookie is set |
| value |
the cookie as a string, using the format of the 'Set-Cookie' HTTP response header value參數的作用是cookie值的字串形式,但格式一定要是http要求標頭格式"Set-Cookie"。
|
api文檔裡的這句話突然讓我驚醒,於是經過百度我查到了cookie的格式相關的文章,現摘抄如下:
原文連結:http://www.cnblogs.com/hdtianfu/archive/2013/05/30/3108295.html
Cookie相關的Http頭
有連個Http頭部和Cookie有關:Set-Cookie和Cookie。 Set-Cookie由伺服器發送,它包含在響應請求的頭部中。它用於在用戶端建立一個Cookie Cookie頭由用戶端發送,包含在HTTP請求的頭部中。
注意,只有cookie的domain和path與請求的URL匹配才會發送這個cookie。
Set-Cookie Header Set-Cookie回應標頭的格式如下所示: Set-Cookie: =[; =]... [; expires=][; domain=] [; path=][; secure][; httponly] expires=: 設定cookie的有效期間,如果cookie超過date所表示的日期時,cookie將失效。 如果沒有設定這個選項,那麼cookie將在瀏覽器關閉時失效。 注意:date是格林威治時間(GMT),使用如下格式表示: DAY, DD MMM YYYY HH:MM:SS GMT DAY The day of the week (Sun, Mon, Tue, Wed, Thu, Fri, Sat). DD The day in the month (such as 01 for the first day of the month). MMM The three-letter abbreviation for the month (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec). YYYY The year. HH The hour value in military time (22 would be 10:00 P.M., for example). MM The minute value. SS The second value. domain= : path=: 註:臨時cookie(沒有expires參數的cookie)不能帶有domain選項。 當用戶端發送一個http請求時,會將有效cookie一起發送給伺服器。 如果一個cookie的domain和path參數和URL匹配,那麼這個cookie就是有效。
一個URL中包含有domain和path,可以參考http://www.w3school.com.cn/html/html_url.asp
secure : 表示cookie只能被發送到http伺服器。 httponly : 表示cookie不能被用戶端指令碼擷取到。
在程式中產生expires
C的方式 time_t curTime = time(NULL); tm * gmTime = gmtime(&curTime); char strExperis[50]; strftime(strTimeBuf, 100, " %a, %d %b %Y %X GMT;", gmTime);
JavaScript的方式 var d = new Date(); var expires = d.toGMTString();
上述紅色加粗的文字更讓我確信了我的判斷,此時此刻的心情有多麼激動就不用說了,嘿嘿
於是,我在原來設定的cookie字串上加上了domain和path欄位,懷著期盼的心情run了下,哈哈,結果正確了,再也不用反覆登入了。
經過此次的bug解決,在編程中不能放過任何一個細節,要對每個運行細節都清清楚楚這樣才能避免盲目的去解決問題,最終浪費時間……
歡迎加入討論群討論:192209234
android用戶端登入工作階段保持,誰做過?
用cookie來實現,可以儲存登入時的cookie值,重寫webview,在實現載入頁面的方法裡面CookieManager處理下,就實現保持登陸回話了
Android httpClient 擷取cookie 後怎全域儲存?訪問webview綁定
cookie 都擷取到了, 儲存還不簡單????