android開發中webview保存cookie問題的解決
最近老是發現在IE裏會有Cookie的問題,如IE下麵無法登出,或無法登錄,或者登錄後信息卻無法取到,而Firefox下麵一直是通過的,都試過好多次了,今天終於找回的主要的原因;Cookie的問題:
首先看一下我的Cookie存取代碼 (這個Cookie操作支持二級域名訪問)
#region 存取Cookie
/// 〈summary〉
/// 存Cookie
/// Json Lee 2007-09-24
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈param name="strValue"〉值〈/param〉
/// 〈param name="expDate"〉到期時間〈/param〉
/// 〈returns〉〈/returns〉
public void SetCookie(string cookieName, string cookieValue, int cookieExpiryMinute)
{
cookieName = cookieName.ToLower();
HttpCookie cookie = new HttpCookie(cookieName,cookieValue);
cookie.Expires = DateTime.Now.AddMinutes(cookieExpiryMinute); //設置Cookie過期時間
cookie.Path = "/";
//設置可訪問Cookie的路徑 為項目下的cookie文件夾及其子文件夾下所有頁麵
//如果需要整個應用程序可訪問 則設置為cookie.Path = "/"; 即可
cookie.Domain = ".163.com";
//以www.163.com為例,若要在 news.163.com等不同主機訪問可以如上設置
//刪除舊的同名Cookie
HttpContext.Current.Response.Cookies.Remove(cookieName);
HttpContext.Current.Response.Cookies.Add(cookie);
}
/// 〈summary〉
/// 存Cookie
/// Json Lee 2007-09-24
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈param name="strValue"〉值〈/param〉
/// 〈returns〉〈/returns〉
public void SetCookie(string cookieName, string cookieValue)
{
SetCookie(cookieName, cookieValue, 60);
}
/// 〈summary〉
/// 清除Cookie
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈returns〉〈/returns〉
public void ClearCookie(string cookieName)
{
SetCookie(cookieName,"",-5);
}
/// 〈summary〉
/// 取Cookie
/// Json Lee 2007-09-24
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈param name="strDefaultValue"〉當沒有值的時候的默認值〈/param〉
/// 〈returns〉〈/returns〉
public string GetCookie(string cookieName, string defaultValue)
{
cookieName = cookieName.ToLower();
string strResult = defaultValue;
try
{
if (HttpContext.Current.Request.Cookies != null)
{
if (HttpContext.Current.Request.Cookies[cookieName] != null)
{
strResult = HttpContext.Current.Request.Cookies[cookieName].Value;
}
}
}
catch (Exception ex)
{
this.WriteWrongLog(ex);
}
return strResult;
}
/// 〈summary〉
/// 取Cookie
/// Json Lee 2007-09-24
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈returns〉〈/returns〉
public string GetCookie(string strName)
{
return GetCookie(strName, "");
}
#endregion
Cookie存取看起來的確很簡單,而在.NET裏麵好像更簡單。
但是......................
往往簡單的東西經常出現一些問題,讓人找不到原因。
我之前這裏出現的問題就是,在寫Cookie的時候,沒有處理舊的同名Cookie,例如:第一次登錄的時候寫入 Cookie username=jsonlee 和 password=123456
有時候有可能會在未退出的情況下重新登錄一下,這樣就會再次寫入同樣的Cookie,但這樣的情況,好像沒有把原來的覆蓋(我用 IECookies 這個工具看到的),而是新加入一個同名的。這樣一來明顯問題就存在了。
所以我在SetCookie的方法裏麵加入了
//刪除舊的同名Cookie
HttpContext.Current.Response.Cookies.Remove(cookieName); 這樣一來問題就解決了。
IE頁麵緩存的問題:
我現在的用戶登錄狀態是通過 Ajax調用一個 GetUserBar.aspx 來取得用戶狀態欄信息的
以下是 GetUserbar.aspx 的代碼
〈%@ Page language="c#" Codebehind="GetUserBar.aspx.cs" Inherits="Web.GetUserBar" %〉
〈%if(CheckIsLogin()){%〉
您好:〈%=this.GetNickname()%〉
〈a href="〈%=UrlRewriteLink.GetUserHomeUrl()%〉"〉您的主頁〈/a〉 |
〈a href='/user/user_setup.aspx'〉個人設置〈/a〉 |
〈a href='/logout.aspx'〉退出〈/a〉
〈%}else{%〉
〈span 〉您已經登錄了!〈/span〉〈a href="/reg.aspx"〉注冊〈/a〉 | 〈a href="/login.aspx"〉登錄〈/a〉
〈%}%〉
如上麵這段代碼,如果通過Ajax調用它,哪就可以在靜態頁麵上取得用戶的登錄信息
可是.......
這個問題就出來了,而且還不容易發現,哪就是IE的頁麵緩存,IE好像有個機製會把訪問過的頁麵緩存到 C:\Documents and Settings\用戶名\Local Settings\Temporary Internet Files 這個文件夾裏麵。所以每個Ajax調用的GetUserBar.aspx時候IE取到的都是緩存信息,而不是GetUserBar.aspx運行的結果。所以才出現了,一直無法登出或無法登錄的狀態(其實是已經登錄登出了的,隻是表麵上看不出來)。
解決辦法就是在 GetUserBar.aspx 的Page_Load方法裏麵加入設定"Response.Expires"的時間的處理,如:
private void Page_Load(object sender, System.EventArgs e)
{
this.Response.Expires = 0;
}
這樣問題就解決了。
網上存在很多的Cookie操作的文章,可是這些東西都是抄來抄去的,哪個站長跟本就沒有對這些代碼做過測試,我以前試著看過好多個,很多是存在有問題的。
希望這篇文章會給需要的人帶來幫助。
android開發中webview保存cookie問題的解決2
最近被這個項目折騰死了
客戶端登錄---客戶端九宮格---webview內容功能模塊
實現思路:
登錄還是調用原來的servlet進行驗證
- List<NameValuePair> myList = new ArrayList<NameValuePair>();
- myList.add(new BasicNameValuePair("STAFFID", username));
- myList.add(new BasicNameValuePair("PWD", password));
- HttpParams params = new BasicHttpParams();
- DefaultHttpClient client = new DefaultHttpClient(params);
- HttpPost post = new HttpPost(actionURL);
- HttpResponse response = null;
- BasicResponseHandler myHandler = new BasicResponseHandler();
- String endResult = null;
- try { post.setEntity(new UrlEncodedFormEntity(myList)); }
- catch (UnsupportedEncodingException e)
- { e.printStackTrace(); }
- try { response = client.execute(post); }
- catch (ClientProtocolException e)
- { e.printStackTrace(); }
- catch (IOException e)
- { e.printStackTrace(); }
驗證成功後保存cookie並保存到SharedPreferences
//獲取cookie信息
- List<Cookie> cookies = client.getCookieStore().getCookies();
- if (cookies.isEmpty()) {
- Log.i(TAG, "-------Cookie NONE---------");
- } else {
- for (int i = 0; i < cookies.size(); i ) {
- //保存cookie
- cookie = cookies.get(i);
- Log.d(TAG, cookies.get(i).getName() "=" cookies.get(i).getValue() );
- if(cookies.get(i).getName().equals("loginStaffId")) {
- //保存登錄信息,下次無需登錄
- String PREFS_NAME = "nma.qztc.com";
- SharedPreferences settings = v.getContext().getSharedPreferences(PREFS_NAME, 0);
- SharedPreferences.Editor editor = settings.edit();
- editor.putString("staff_id", username);
- editor.putString("pwd", password);
- editor.commit();
- return true;
- }
-----------------------------------------------
將cookie信息帶入到webview中,之前總是出現有時cookie讀取成功有時不成功,找了半天發現將
cookieManager.removeSessionCookie();
這句去掉就好了,暫時還沒有出現什麼問題,由於原來的web應用是采用session驗證,所以在讀取cookie成功後也將session信息寫入,這樣就雙保險了
//設置cookie信息
- Cookie sessionCookie = OnLoginListenerImpl.cookie;
- CookieSyncManager.createInstance(this);
- CookieManager cookieManager = CookieManager.getInstance();
- if (sessionCookie != null) {
- //cookieManager.removeSessionCookie();
- cookieString = sessionCookie.getName() "=" sessionCookie.getValue() "; domain=" sessionCookie.getDomain();
- Log.d("----nma cookie-----",cookieString);
- //Log.d("----url-----",getString(getResources().getIdentifier(url,"string", getPackageName())));
- cookieManager.setCookie(getString(getResources().getIdentifier(url,"string", getPackageName())), cookieString);
- CookieSyncManager.getInstance().sync();
- }
最後更新:2017-04-02 16:47:54