一般用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 只能夠得 “;” 前的部分。