在Android应用程序中,当使用DefaultHttpClient
获取URL内容(执行HttpGet)时,我在日志中收到以下警告:
W/ResponseProcessCookies(20386): Invalid cookie header: "Set-Cookie: NSC_vbue_iuuq=ffff660; expires=; domain=private.false.name; path=/; isSecure=false". Unable to parse expires attribute:
我理解警告,因为expires
字段不包含有效的日期格式。我理解这可能是因为它是一个'会话cookie'(没有专家)。 Thread about similar situation in Curl context
在网上搜索我发现主要是
.setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH (or other) )
通过正确解析包含逗号的日期来避免警告的选项。
但是,我想避免该日志。 (不是通过禁用日志)
我相信内部一切都很好,因为“I GUESS”,cookie.setExpiryDate()
根本就没有被调用。
您认为我需要HTTP客户端的特定配置(我没有设置特定配置)以避免该警告或支持空过期吗?
感谢。
答案 0 :(得分:4)
如果你不介意改变CookieSpec
,你可以提供你自己的,更宽松的子类。
首先,创建一个接受CookieSpec
的宽容null
和expires
属性的空值,如下所示:
class LenientCookieSpec extends BrowserCompatSpec {
public LenientCookieSpec() {
super();
registerAttribHandler(ClientCookie.EXPIRES_ATTR, new BasicExpiresHandler(DATE_PATTERNS) {
@Override public void parse(SetCookie cookie, String value) throws MalformedCookieException {
if (TextUtils.isEmpty(value)) {
// You should set whatever you want in cookie
cookie.setExpiryDate(null);
} else {
super.parse(cookie, value);
}
}
});
}
}
现在你需要注册&在HTTP客户端中选择这个新的CookieSpec
。
DefaultHttpClient client = new DefaultHttpClient();
client.getCookieSpecs().register("lenient", new CookieSpecFactory() {
public CookieSpec newInstance(HttpParams params) {
return new LenientCookieSpec();
}
});
HttpClientParams.setCookiePolicy(client.getParams(), "lenient");
“像这样的东西”可能适合你。
答案 1 :(得分:0)
我刚刚收到类似下面的警告
Invalid cookie header: "Set-Cookie: A3=d=AQABBPA3c18CEOtNC3d8X1pEkCvrf2cxZRIFEgEBAQGJdF99XwAAAAAA_SMAAA&S=AQAAAiTHBvO_oaoz8tCr1A7ArCs; Expires=Wed, 29 Sep 2021 19:34:41 GMT; Max-Age=31557600; Domain=.yahoo.com; Path=/; SameSite=None; Secure; HttpOnly". Invalid 'expires' attribute: Wed, 29 Sep 2021 19:34:41 GMT
我的环境是http client-4.5.12,原因是需要设置cookiesSpec。
解决方法(只需忽略其他参数)
requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
httpclient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig).build();
您可以在此处更改CookieSpecs.XXX以符合您的条件,在大多数情况下,STANDARD可以,详细信息可以参考最新的apache文档https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/statemgmt.html
请注意, HttpClientParams (前面提到的某些页面)是已弃用的类,只需使用RequestConfig作为替代。