很有趣,但是 java.net.HttpCookie 类无法解析带有域和/或路径部分的 cookie 字符串,而这个确切的 java.net.HttpCookie 类已转换为字符串。
例如:
HttpCookie newCookie = new HttpCookie("cookieName", "cookieValue");
newCookie.setDomain("cookieDomain.com");
newCookie.setPath("/");
由于这个类既不实现 Serializable 也不实现 Parcelable,因此将 cookie 存储为字符串是很诱人的。所以你写这样的东西:
saveMyCookieAsString(newCookie.toString());
此语句将 cookie 保存为以下格式:
cookieName="cookieValue";$Path="/";$Domain="cookiedomain.com"
然后你想恢复这个cookie,所以你得到了字符串:
String cookieAsString = restoreMyCookieString();
并尝试解析它:
List<HttpCookie> cookiesList = HttpCookie.parse(cookieAsString);
StringBuilder myCookieAsStringNow = new StringBuilder();
for(HttpCookie httpCookie: cookiesList) {
myCookieAsStringNow.append(httpCookie.toString());
}
现在myCookieAsStringNow.toString(); 产生
cookieName=cookieValue
域和路径部分刚刚消失了。原因:parse 方法对“domain”和“path”之类的词区分大小写。
可能的解决方法:提供另一个 toString() 方法,例如:
public static String httpCookieToString(HttpCookie httpCookie) {
StringBuilder result = new StringBuilder()
.append(httpCookie.getName())
.append("=")
.append("\"")
.append(httpCookie.getValue())
.append("\"");
if(!TextUtils.isEmpty(httpCookie.getDomain())) {
result.append("; domain=")
.append(httpCookie.getDomain());
}
if(!TextUtils.isEmpty(httpCookie.getPath())){
result.append("; path=")
.append(httpCookie.getPath());
}
return result.toString();
}
我觉得它很有趣(尤其是像 java.net.HttpCookie 这样的目标是被很多人使用的类),我希望它对某人有用。