您的位置:首页 > 移动开发

android webview 设置 Cookie

2016-11-30 18:46 393 查看
(转载)http://www.cnblogs.com/breeze1988/articles/3976035.html

  一般用webview的时候都不会考虑Cookie问题,但是某些需求考虑到用户登录问题,所以就得考虑给webview设置Cookie.
   我用的实现方式是将Cookie存放到 HashMap 并 保存到 SharedPreferences,然后再需要使用到的地方取出来使用



//存储Cookie部分代码
private static Map<String, String> cookieStore = new HashMap<String, String>();
private static DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(request);
// 得到响应的字符串
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
CookieStore cks = httpClient.getCookieStore();
List<Cookie> cs = cks.getCookies();// 获取远程cookie
boolean flag = false;// 是否更新cookie文件
if (cs != null) {
for (Cookie cookie : cs) {
String name = cookie.getName();
String val = cookie.getValue();
String cacheVal = cookieStore.get(name);
if (!val.equals(cacheVal)) {// 本地cookie与远程cookie不同步,则覆盖本地cookie
flag = true;
cookieStore.put(name, val);// 更新内存中的cookie
cookieStore.put("Path", cookie.getPath());
cookieStore.put("Domain", cookie.getDomain());
// cookieStore.put("Comment", cookie.getComment());
// cookieStore.put("Ports",
// String.valueOf(cookie.getPorts()));
// cookieStore.put("CommentURL",
// cookie.getCommentURL());
continue;
}
}
}
SharedPreferences sp = getSharedPreferences(mContext, SP_COOKIES);
Editor ed = sp.edit();
if (cookieStore != null) {
Set<String> keys = cookieStore.keySet();
for (String key : keys) {
ed.putString(key, cookieStore.get(key));
}
}
ed.commit();


在webview 上加载loadUrl(url)前加入如下代码


CookieSyncManager.createInstance(CarServiceActivity.this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);

Map<String, String> cookies = (Map<String, String>) Util.getInstance().getCookiesFromFile(
CarServiceActivity.this);
String Domain = null;
String path = null;
// 得到Domain 和 Path
for (String key : cookies.keySet()) {
if (key.equalsIgnoreCase("Domain")) {
Domain = cookies.get(key);
} else if (key.equalsIgnoreCase("Path")) {
path = cookies.get(key);
}
}
//拼接成想要格式
for (String key : cookies.keySet()) {
if (!key.equals("Domain") && !key.equals("Path")) {
String value = cookies.get(key);
StringBuilder sb = new StringBuilder();
sb.append(key + "=" + value + ";");
sb.append("domain=" + Domain + ";" + "path=" + path);
cookieManager.setCookie(Constant.URL_JCHD, sb.toString());
sb = null;
}
}
String cookieString = cookieManager.getCookie(Constant.URL_JCHD);
CookieSyncManager.getInstance().sync();
}


   这里要注意一个问题就是,如果你的cookie上只有一个键值对,那么你只需要设置一次setCookie(url,cookieContent)就OK,但是如果你需要在多个键值对,比如除了sessionID,还需要设备号信息(用于判断单点登录),那么你就需要多次设置setCookie,并且注意cookieContent格式。具体参考 http://kinbos.blog.51cto.com/2092114/1347859  
我这里格式是 “key=value;domain=domainContent;path=pathContent”
一开始我这里写成:
// String cookie1 = "JSESSIONID=" + Constant.sessionId +

// ";signCiphertext=" + Constant.signCiphertext +

// ";type=" + Constant.SREQUESTTYPE +

// ";pcbVersion=" + Constant.PCB_VERSION +

// ";deviceKey="+Constant.deviceKey +

// ";domain=" + Constant.domain +

// ";path=" + "/pcb/"; 
但是服务器只获得了 "JSESSIONID=" + Constant.sessionId 这个Cookie 内容,其他的COOKIE内容都丢失了,这是因为 CookieManager 只能够得 “;” 前的部分。 

相信一万小时定律,我没天赋,但我能用努力和坚持来弥补
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: