android webview 设置 Cookie

(转载)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 只能够得 “;” 前的部分。 

复制代码
相信一万小时定律,我没天赋,但我能用努力和坚持来弥补

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值