閱讀615 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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進行驗證

[java] view plaincopy
  1. List<NameValuePair> myList = new ArrayList<NameValuePair>();  
  2.                  myList.add(new BasicNameValuePair("STAFFID", username));  
  3.                  myList.add(new BasicNameValuePair("PWD", password));  
  4.                  HttpParams params = new BasicHttpParams();  
  5.                  DefaultHttpClient client = new DefaultHttpClient(params);  
  6.                  HttpPost post = new HttpPost(actionURL);  
  7.                  HttpResponse response = null;  
  8.                  BasicResponseHandler myHandler = new BasicResponseHandler();  
  9.                  String endResult = null;  
  10.                  try { post.setEntity(new UrlEncodedFormEntity(myList)); }  
  11.                  catch (UnsupportedEncodingException e)  
  12.                  { e.printStackTrace(); }  
  13.                  try { response = client.execute(post); }  
  14.                  catch (ClientProtocolException e)  
  15.                  { e.printStackTrace(); }  
  16.                  catch (IOException e)  
  17.                  { e.printStackTrace(); }  
 

驗證成功後保存cookie並保存到SharedPreferences

//獲取cookie信息
 

[java] view plaincopy
  1. List<Cookie> cookies = client.getCookieStore().getCookies();  
  2.          if (cookies.isEmpty()) {  
  3.           Log.i(TAG, "-------Cookie NONE---------");  
  4.        } else {                 
  5.          for (int i = 0; i < cookies.size(); i ) {  
  6.           //保存cookie  
  7.           cookie = cookies.get(i);  
  8.          Log.d(TAG, cookies.get(i).getName() "=" cookies.get(i).getValue() );  
  9.          if(cookies.get(i).getName().equals("loginStaffId"))  {               
  10.           //保存登錄信息,下次無需登錄  
  11.           String PREFS_NAME = "nma.qztc.com";  
  12.           SharedPreferences settings = v.getContext().getSharedPreferences(PREFS_NAME, 0);  
  13.           SharedPreferences.Editor editor = settings.edit();               
  14.           editor.putString("staff_id", username);  
  15.           editor.putString("pwd", password);  
  16.           editor.commit();  
  17.           return true;  
  18.          }  

-----------------------------------------------

將cookie信息帶入到webview中,之前總是出現有時cookie讀取成功有時不成功,找了半天發現將

cookieManager.removeSessionCookie();
這句去掉就好了,暫時還沒有出現什麼問題,由於原來的web應用是采用session驗證,所以在讀取cookie成功後也將session信息寫入,這樣就雙保險了

//設置cookie信息
 

[java] view plaincopy
  1. Cookie sessionCookie = OnLoginListenerImpl.cookie;  
  2.         CookieSyncManager.createInstance(this);  
  3.         CookieManager cookieManager = CookieManager.getInstance();  
  4.         if (sessionCookie != null) {  
  5.         //cookieManager.removeSessionCookie();  
  6.         cookieString = sessionCookie.getName() "=" sessionCookie.getValue() "; domain=" sessionCookie.getDomain();  
  7.         Log.d("----nma cookie-----",cookieString);  
  8.         //Log.d("----url-----",getString(getResources().getIdentifier(url,"string", getPackageName())));  
  9.         cookieManager.setCookie(getString(getResources().getIdentifier(url,"string", getPackageName())), cookieString);  
  10.         CookieSyncManager.getInstance().sync();  
  11.         }  


最後更新:2017-04-02 16:47:54

  上一篇:go Android布局實現圓角邊框
  下一篇:go Android: 在WebView中獲取網頁源碼