我要使用 apache HttpClient 从 HTTP 服务器获取内容。我的 HttpClient 对象使用 BrowserCompatSpec
类来处理 cookie。
有时服务器会返回这样的 HTTP 响应 header :
"Set-Cookie: foo=deleted; expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=-1404230328; path=/; domain=.domain.com"
在 HttpClient 中处理响应期间,我收到警告:
Jul 01, 2014 8:15:12 PM org.apache.http.client.protocol.ResponseProcessCookies processCookies
WARNING: Invalid cookie header: "Set-Cookie: foo=deleted; expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=-1404230328; path=/; domain=.domain.com".
Negative max-age attribute: -1404230328
因此,foo
cookie 未删除并具有旧值。
RFC2109 中的 Max-Age 属性描述:
Max-Age=delta-seconds
Optional. The Max-Age attribute defines the lifetime of the
cookie, in seconds. The delta-seconds value is a decimal non-
negative integer. After delta-seconds seconds elapse, the client
should discard the cookie. A value of zero means the cookie
should be discarded immediately.
我认为 - BrowserCompatSpec
工作正常,这个问题是服务器的缺陷。但我无法影响服务器行为。
如何忽略此警告并将 foo
cookie 设置为过期而不干预 HttpClient lib?
最佳答案
我在 documentation (3.4. Custom cookie policy) 中找到了解决方案。使用本手册,我编写了 mySpecProvider
,它使用覆盖的 max-age 属性处理程序创建新的 cookie 规范。
val mySpecProvider = new CookieSpecProvider {
override def create(context: HttpContext): CookieSpec = {
val spec = new BrowserCompatSpec()
spec.registerAttribHandler(ClientCookie.MAX_AGE_ATTR, new MyCookieMaxAgeHandler())
spec
}
}
然后我创建新的寄存器:
val cookiesRegistry = RegistryBuilder.create[CookieSpecProvider]()
.register("myspec", mySpecProvider)
.build()
并在客户端构建器中添加了注册
val clientBuilder = HttpAsyncClients.custom()
.setDefaultCookieSpecRegistry(cookiesRegistry)
使用新 cookie 规范的配置
val reqConfig = RequestConfig.custom()
.setCookieSpec("myspec")
MyCookieMaxAgeHandler
如下所示:
class MyCookieMaxAgeHandler extends BasicMaxAgeHandler {
override def parse(cookie: SetCookie, value: String) {
try {
if (value.toInt >= 0)
super.parse(cookie, value)
} catch {
case e: Exception =>
throw new MalformedCookieException("Invalid max-age attribute: " + value)
}
}
}
毕竟这些操作忽略了负 max-age 属性。
关于scala - 无效的 cookie header : Negative max-age attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24515788/