android webview 如何存储cookie
3个回答
推荐于2016-07-23 · 知道合伙人软件行家
关注
展开全部
在App中嵌入网页,使用Nativie方式登录,然后将cookie保存到WebView中,实现免登录功能。同步Cookie到WebView的方法可以参考下面的代码:
/**
* Sync Cookie
*/
private void syncCookie(Context context, String url){
try{
Log.d("Nat: webView.syncCookie.url", url);
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除
cookieManager.removeAllCookie();
String oldCookie = cookieManager.getCookie(url);
if(oldCookie != null){
Log.d("Nat: webView.syncCookieOutter.oldCookie", oldCookie);
}
StringBuilder sbCookie = new StringBuilder();
sbCookie.append(String.format("JSESSIONID=%s","INPUT YOUR JSESSIONID STRING"));
sbCookie.append(String.format(";domain=%s", "INPUT YOUR DOMAIN STRING"));
sbCookie.append(String.format(";path=%s","INPUT YOUR PATH STRING"));
String cookieValue = sbCookie.toString();
cookieManager.setCookie(url, cookieValue);
CookieSyncManager.getInstance().sync();
String newCookie = cookieManager.getCookie(url);
if(newCookie != null){
Log.d("Nat: webView.syncCookie.newCookie", newCookie);
}
}catch(Exception e){
Log.e("Nat: webView.syncCookie failed", e.toString());
}
}
使用上面的方法可以将Cookie同步到WebView中,这样浏览网页时即可实现免登录。
但是在实际使用过程中会出现Cookie并未保存成功,每次都会跳转到登录页面应为初始化WebView时漏掉了重要的东西。可以参考下面代码设置WebView。
/**
* init WebView Settings
* */
private void initWebViewSettings(){
// myWebView.getSettings().setSupportZoom(true);
// myWebView.getSettings().setBuiltInZoomControls(true);
// myWebView.getSettings().setDefaultFontSize(12);
// myWebView.getSettings().setLoadWithOverviewMode(true);
// 设置可以访问文件
myWebView.getSettings().setAllowFileAccess(true);
//如果访问的页面中有Javascript,则webview必须设置支持Javascript
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.getSettings().setUserAgentString(MyApplication.getUserAgent());
myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
myWebView.getSettings().setAllowFileAccess(true);
myWebView.getSettings().setAppCacheEnabled(true);
myWebView.getSettings().setDomStorageEnabled(true);
myWebView.getSettings().setDatabaseEnabled(true);
}
完成以上两步操作,再次运行程序,就会发现,打开网页后不会再跳转到登录页面了。
/**
* Sync Cookie
*/
private void syncCookie(Context context, String url){
try{
Log.d("Nat: webView.syncCookie.url", url);
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除
cookieManager.removeAllCookie();
String oldCookie = cookieManager.getCookie(url);
if(oldCookie != null){
Log.d("Nat: webView.syncCookieOutter.oldCookie", oldCookie);
}
StringBuilder sbCookie = new StringBuilder();
sbCookie.append(String.format("JSESSIONID=%s","INPUT YOUR JSESSIONID STRING"));
sbCookie.append(String.format(";domain=%s", "INPUT YOUR DOMAIN STRING"));
sbCookie.append(String.format(";path=%s","INPUT YOUR PATH STRING"));
String cookieValue = sbCookie.toString();
cookieManager.setCookie(url, cookieValue);
CookieSyncManager.getInstance().sync();
String newCookie = cookieManager.getCookie(url);
if(newCookie != null){
Log.d("Nat: webView.syncCookie.newCookie", newCookie);
}
}catch(Exception e){
Log.e("Nat: webView.syncCookie failed", e.toString());
}
}
使用上面的方法可以将Cookie同步到WebView中,这样浏览网页时即可实现免登录。
但是在实际使用过程中会出现Cookie并未保存成功,每次都会跳转到登录页面应为初始化WebView时漏掉了重要的东西。可以参考下面代码设置WebView。
/**
* init WebView Settings
* */
private void initWebViewSettings(){
// myWebView.getSettings().setSupportZoom(true);
// myWebView.getSettings().setBuiltInZoomControls(true);
// myWebView.getSettings().setDefaultFontSize(12);
// myWebView.getSettings().setLoadWithOverviewMode(true);
// 设置可以访问文件
myWebView.getSettings().setAllowFileAccess(true);
//如果访问的页面中有Javascript,则webview必须设置支持Javascript
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.getSettings().setUserAgentString(MyApplication.getUserAgent());
myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
myWebView.getSettings().setAllowFileAccess(true);
myWebView.getSettings().setAppCacheEnabled(true);
myWebView.getSettings().setDomStorageEnabled(true);
myWebView.getSettings().setDatabaseEnabled(true);
}
完成以上两步操作,再次运行程序,就会发现,打开网页后不会再跳转到登录页面了。
展开全部
在IE里的Cookie问题,如IE下面无法登出,或无法登录,或者登录後信息却无法取到,而Firefox下面一直是通过的,下面是Cookie问题的主要原因:
首先看一下Cookie存取代码 (这个Cookie操作支持二级域名访问)
#region 存取Cookie
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.Domain = ".163.com";
HttpContext.Current.Response.Cookies.Remove(cookieName);
HttpContext.Current.Response.Cookies.Add(cookie);
}
public void SetCookie(string cookieName, string cookieValue)
{
SetCookie(cookieName, cookieValue, 60);
}
public void ClearCookie(string cookieName)
{
SetCookie(cookieName,"",-5);
}
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;
}
public string GetCookie(string strName)
{
return GetCookie(strName, "");
}
#endregion
Cookie存取看起来的确很简单,而在.NET里面好像更简单。
但是......................
往往简单的东西经常出现一些问题,让人找不到原因。
之前这里出现的问题就是,在写Cookie的时候,没有处理旧的同名Cookie,例如:第一次登录的时候写入 Cookie username=jsonlee 和 password=123456
有时候有可能会在未退出的情况下重新登录一下,这样就会再次写入同样的Cookie,但这样的情况,好像没有把原来的覆盖(我用 IECookies 这个工具看到的),而是新加入一个同名的。这样一来明显问题就存在了。
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操作的文章,可是这些东西都是抄来抄去的,哪个站长跟本就没有对这些代码做过测试,我以前试著看过好多个,很多是存在有问题的。
首先看一下Cookie存取代码 (这个Cookie操作支持二级域名访问)
#region 存取Cookie
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.Domain = ".163.com";
HttpContext.Current.Response.Cookies.Remove(cookieName);
HttpContext.Current.Response.Cookies.Add(cookie);
}
public void SetCookie(string cookieName, string cookieValue)
{
SetCookie(cookieName, cookieValue, 60);
}
public void ClearCookie(string cookieName)
{
SetCookie(cookieName,"",-5);
}
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;
}
public string GetCookie(string strName)
{
return GetCookie(strName, "");
}
#endregion
Cookie存取看起来的确很简单,而在.NET里面好像更简单。
但是......................
往往简单的东西经常出现一些问题,让人找不到原因。
之前这里出现的问题就是,在写Cookie的时候,没有处理旧的同名Cookie,例如:第一次登录的时候写入 Cookie username=jsonlee 和 password=123456
有时候有可能会在未退出的情况下重新登录一下,这样就会再次写入同样的Cookie,但这样的情况,好像没有把原来的覆盖(我用 IECookies 这个工具看到的),而是新加入一个同名的。这样一来明显问题就存在了。
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操作的文章,可是这些东西都是抄来抄去的,哪个站长跟本就没有对这些代码做过测试,我以前试著看过好多个,很多是存在有问题的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2016-06-24 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517195
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
实现思路:
登录还是调用原来的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();
}
登录还是调用原来的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();
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询