scala - 无效的 cookie header : Negative max-age attribute

标签 scala cookies apache-httpclient-4.x

我要使用 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/

相关文章:

php - iFrame - 隐藏 url 和 session 不工作

java - 如何使用 Apache HTTP 组件为每个路由配置 SSLSocket 工厂

apache-httpclient-4.x - 如何使用 Apache HTTPComponents HttpClient 在 HTTP 请求中启用 SNI?

java - Kafka - 关闭(kafka.server.KafkaServer),启动 Kafka-Server-Start 时出现问题

api - 为什么scala中同时使用transform和map方法?

java - 解析scala中的日期(java时间api)

javascript - 如何将 = 字符更改为 "with the value"

javascript - 关于_deleteCustomVar()的使用问题

java - Apache HttpAsyncClient

scala - 在Scala中应用几个字符串转换