【问题标题】:android URLConnection and cookiesandroid URLConnection 和 cookie
【发布时间】:2015-06-25 10:44:24
【问题描述】:

我一直在努力尝试在登录后保持会话,我想知道是否有人可以提供帮助。我本来打算尝试 Apache,但 android documentation 表示他们已经放弃了 Apache,转而使用 Java 的 URLConnection。

  1. 如果我将 cookie 数据存储为额外的捆绑包,我该如何处理 数据并将其添加回 CookieManager?

  2. 将cookie数据存储成字符串然后传 使用捆绑附加功能将它用于我的下一个活动?

  3. 我是否必须在每个活动中创建一个 CookieManager 并且基本上 在每个请求之后存储它,重新分配它,然后发出我的下一个 请求?

    //登录.java: 私人 CookieManager loginCookie = new CookieManager(); extras.putString("Cookies", loginCookie.toString());

    //LoggedIn.java:
    Bundle bundle = intent.getExtras();
    String strCookies = bundle.getString("Cookies");
    SummaryCookies = (CookieManager)strCookies; //I tried casting the strCookies back to a CookieManager, but that did not work. :(
    

如何从 strCookies 中获取我的 cookie 并将其转换回 CookieManager 可以理解的格式?

【问题讨论】:

    标签: java android cookies httpurlconnection


    【解决方案1】:

    1+2) 我不认为使用 Cookie 是一个好方法,因为当您停止应用程序时,该 cookie 也会被删除。您应该将它们保存到持久存储中并在以后使用它们。

    3) 您必须实现自己的 CookieStore,然后创建一个 CookieManager 并使用 CookieHandler.setDefault(...) 设置其默认值。这适用于整个系统,因此您不应该为每个活动都创建它。

    4) 如果您仍想使用您的方法。您可以通过 getHeaderFields() 方法从响应头中获取 Cookie,并查询“Set-Cookie”和“Set-Cookie2”头。像“Set-Cookie:Your-string-cookie-here”那样构建你的标题字符串并使用 HttpCookie.parse(headerString) 来获取你的列表 HttpCookie 对象。

    这是一个创建持久 cookie 存储的示例。如果您需要,这里是完整的源代码:https://github.com/nguyentrungduy/Customize-CookieStore

    @Override
    public void add(URI uri, HttpCookie cookie) {
        // TODO Auto-generated method stub
        synchronized (this) {
            URI uri2 = createURI(uri);
            List<HttpCookie> cookies = mCookies.get(uri2);
            if (cookies == null) {
                cookies = new ArrayList<HttpCookie>();
                mCookies.put(uri2, cookies);
            } else {
                cookies.remove(cookie);
            }
            cookies.add(cookie);
            // Save into SharePreferenced
            saveToPersistent(uri2, cookies);
        }
    }
    
    @Override
    public List<HttpCookie> get(URI uri) {
        // TODO Auto-generated method stub
        synchronized (this) {
            List<HttpCookie> httpCookies = new ArrayList<HttpCookie>();
            List<HttpCookie> values = mCookies.get(uri);
            if (values != null) {
                for (HttpCookie httpCookie : values) {
                    if (!httpCookie.hasExpired()) {
                        httpCookies.add(httpCookie);
                    }
                }
            }
    
            Set<Entry<URI, List<HttpCookie>>> set = mCookies.entrySet();
            for (Entry<URI, List<HttpCookie>> entry : set) {
                if (uri.equals(entry.getKey())) {
                    continue;
                }
                List<HttpCookie> cookies = entry.getValue();
                Iterator<HttpCookie> iterator = cookies.iterator();
                while (iterator.hasNext()) {
                    HttpCookie cookie = iterator.next();
                    String domain = cookie.getDomain();
                    if (!domainMatches(domain, uri.getHost())) {
                        continue;
                    }
                    if (cookie.hasExpired()) {
                        iterator.remove();
                    } else if (!httpCookies.contains(cookie)) {
                        httpCookies.add(cookie);
                    }
                }
            }
            return Collections.unmodifiableList(httpCookies);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 1970-01-01
      • 2021-11-27
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多