如何解析 cookie 字符串

新手上路,请多包涵

我想要一个 Cookie 字符串(因为它可能在 Set-Cookie 标头中返回)并且能够轻松修改它的部分内容,特别是到期日期。

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

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

有任何想法吗?

谢谢

原文由 cottonBallPaws 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

我相信你必须手动解析它。尝试这个:

 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;
}

我还没有实际编译或运行这段代码,但它应该是一个良好的开端。您可能不得不稍微弄乱日期解析:我不确定 cookie 中使用的日期格式实际上与 DateFormat.FULL 相同。 (查看 这个 相关问题,它解决了处理 cookie 中日期格式的问题。)另外,请注意,有一些 cookie 属性未由 BasicClientCookie 处理,例如 versionhttponly

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

原文由 Doug Paul 发布,翻译遵循 CC BY-SA 3.0 许可协议

怎么样 java.net.HttpCookie

 List<HttpCookie> cookies = HttpCookie.parse(header);

原文由 yegor256 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题