如何解析 Cookie 字符串
我想采用一个Cookie字符串(因为它可能会在Set-Cookie标头中返回),并能够轻松修改其中的一部分,特别是到期日期。
我看到有几种不同的Cookie类,例如BasicClientCookie,但我没有看到任何简单的方法将字符串解析为其中一个对象。
我看到在api级别9中,他们添加了具有解析方法的HttpCookie,但我需要在以前的版本中工作。
有什么想法吗?
谢谢
我想采用一个Cookie字符串(因为它可能会在Set-Cookie标头中返回),并能够轻松修改其中的一部分,特别是到期日期。
我看到有几种不同的Cookie类,例如BasicClientCookie,但我没有看到任何简单的方法将字符串解析为其中一个对象。
我看到在api级别9中,他们添加了具有解析方法的HttpCookie,但我需要在以前的版本中工作。
有什么想法吗?
谢谢
我相信你必须手动解析它。试试这个:
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中使用的日期格式实际上是否与相同。(查看此相关问题,其中介绍了如何处理 Cookie 中的日期格式。另外,请注意,有些 cookie 属性未由 处理,例如 和 。DateFormat.FULL
BasicClientCookie
version
httponly
最后,此代码假设 Cookie 的名称和值显示为第一个属性:我不确定这是否一定是正确的,但这就是我见过的每个 Cookie 的排序方式。