android开发中webview保存cookie问题的解决-阿里云开发者社区

开发者社区> 一叶飘舟> 正文

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 style="margin-right:10px; "〉您已经登录了!〈/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.         }  


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
IntelliJ IDEA常见问题解决办法汇总
IntelliJ IDEA常见问题解决办法汇总
710 0
VS2010无法保存项目文件(.csprj)的问题解决方法
VS2010无法保存项目文件(.csprj)的问题解决方法   【出错提示】保存项目文件“XXX”时出错。类没有注册。正在查找具有CLSID的对象:{D9B3211D-E57F-4426-AAEF-30A806ADD397}。
940 0
Android官方开发文档Training系列课程中文版:连接无线设备之网络服务搜索功能
原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/index.html 引言 Android设备除了可以与服务器建立连接之外,Android无线API还允许处于同一网段下的两台设备建立连接,或者是物理距离相近的两台设备建立连接。
802 0
android 记一次解决键盘遮挡问题
文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者出现页面整体上移的,或多或少在体验上都不是很优雅,今天提供个方法是自行控制页面上移距离,竟可能让页面呈现给用户友好点。
2115 0
Android官方开发文档Training系列课程中文版:连接无线设备之通过P2P搜索网络服务
原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/nsd-wifi-direct.html 本阶段的第一节课 Using Network Service Discovery 展示了如何搜索本地网络服务。
800 0
安卓开发之ScrollView
当界面不足以将所有的内容显示出来的时候便导致下面的部分内容无法显示出来 所有加上ScrollView 来讲要显示的内容放入之中便可以实现上下滚动界面内容 但是当要显示多个控件的时候会出错  原因是ScrollView只能有一个子控件  解决方法就是 用一个LinearLayout(或者别的布局)...
545 0
+关注
1635
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载