首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解析cookie字符串

如何解析cookie字符串
EN

Stack Overflow用户
提问于 2011-04-07 08:31:56
回答 9查看 89.5K关注 0票数 38

我想接受一个Cookie字符串(因为它可能会在Set-Cookie头中返回),并且能够轻松地修改它的某些部分,特别是过期日期。

我看到有几个不同的Cookie类,比如BasicClientCookie,但我没有看到任何简单的方法来将字符串解析为其中一个对象。

我看到在API9级中他们添加了HttpCookie,它有一个解析方法,但我需要一些东西才能在以前的版本中工作。

有什么想法吗?

谢谢

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-04-07 09:54:19

我相信你必须手动解析出来。试试这个:

代码语言:javascript
运行
复制
BasicClientCookie parseRawCookie(String rawCookie) throws Exception {
    String[] rawCookieParams = rawCookie.split(";");

    String[] rawCookieNameAndValue = rawCookieParams[0].split("=");
    if (rawCookieNameAndValue.length != 2) {
        throw new Exception("Invalid cookie: missing name and value.");
    }

    String cookieName = rawCookieNameAndValue[0].trim();
    String cookieValue = rawCookieNameAndValue[1].trim();
    BasicClientCookie cookie = new BasicClientCookie(cookieName, cookieValue);
    for (int i = 1; i < rawCookieParams.length; i++) {
        String rawCookieParamNameAndValue[] = rawCookieParams[i].trim().split("=");

        String paramName = rawCookieParamNameAndValue[0].trim();

        if (paramName.equalsIgnoreCase("secure")) {
            cookie.setSecure(true);
        } else {
            if (rawCookieParamNameAndValue.length != 2) {
                throw new Exception("Invalid cookie: attribute not a flag or missing value.");
            }

            String paramValue = rawCookieParamNameAndValue[1].trim();

            if (paramName.equalsIgnoreCase("expires")) {
                Date expiryDate = DateFormat.getDateTimeInstance(DateFormat.FULL)
                        .parse(paramValue);
                cookie.setExpiryDate(expiryDate);
            } else if (paramName.equalsIgnoreCase("max-age")) {
                long maxAge = Long.parseLong(paramValue);
                Date expiryDate = new Date(System.getCurrentTimeMillis() + maxAge);
                cookie.setExpiryDate(expiryDate);
            } else if (paramName.equalsIgnoreCase("domain")) {
                cookie.setDomain(paramValue);
            } else if (paramName.equalsIgnoreCase("path")) {
                cookie.setPath(paramValue);
            } else if (paramName.equalsIgnoreCase("comment")) {
                cookie.setPath(paramValue);
            } else {
                throw new Exception("Invalid cookie: invalid attribute name.");
            }
        }
    }

    return cookie;
}

我还没有实际编译或运行这段代码,但这应该是一个很好的开始。您可能需要稍微修改一下日期解析:我不确定cookies中使用的日期格式是否真的与DateFormat.FULL相同。(查看与this相关的问题,该问题解决了如何处理cookies中的日期格式。)另外,请注意有一些BasicClientCookie不能处理的cookie属性,比如versionhttponly

最后,这段代码假设cookie的名称和值显示为第一个属性:我不确定这是否是真的,但这就是我所见过的每个cookie的排序方式。

票数 16
EN

Stack Overflow用户

发布于 2013-04-02 01:10:09

java.net.HttpCookie怎么样?

代码语言:javascript
运行
复制
List<HttpCookie> cookies = HttpCookie.parse(header);
票数 110
EN

Stack Overflow用户

发布于 2012-10-28 06:51:00

为此,您可以使用Apache HttpClient的工具。

以下是CookieJar的摘录

代码语言:javascript
运行
复制
CookieSpec cookieSpec = new BrowserCompatSpec();

List<Cookie> parseCookies(URI uri, List<String> cookieHeaders) {
    ArrayList<Cookie> cookies = new ArrayList<Cookie>();
    int port = (uri.getPort() < 0) ? 80 : uri.getPort();
    boolean secure = "https".equals(uri.getScheme());
    CookieOrigin origin = new CookieOrigin(uri.getHost(), port,
            uri.getPath(), secure);
    for (String cookieHeader : cookieHeaders) {
        BasicHeader header = new BasicHeader(SM.SET_COOKIE, cookieHeader);
        try {
            cookies.addAll(cookieSpec.parse(header, origin));
        } catch (MalformedCookieException e) {
            L.d(e);
        }
    }
    return cookies;
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5574530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档