1

我在一个项目中使用 Spring for Android,我需要管理 cookie 存储/管理器。我可以使用 的实现向任何请求添加 cookie ClientHttpRequestInterceptor,但我想在发送请求时删除其中的一些。

更具体地说,我面临的问题是,对于 Froyo,特定于Spring(with DefaultHttpClient) 的实现会自动将来自的 cookie 添加到标头CookieStore- 即使我明确设置标头。但我想自己管理这些 cookie(删除其中的一些,或更新它们的值)。虽然对于上面的 Gingerbread (Spring实现完成HttpURLConnection),cookie 仅在我自己做时才添加 - 但是我不确定,因为我没有看到 Spring 设置任何内容CookieHandler,但最重要的是我没有看到它们执行请求时,或者我可以看到它们已更新。所以这个问题更具体到 Froyo。

解决方法是重置连接工厂;就像是:

protected void resetCookieStoreForTemplate(RestTemplate template) {
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
        template.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
    }
}

在下面,这似乎重新创建了 DefaultHttpClient 并将使用新的CookieStore. 但这在我看来有点难看。

最后,我的问题是:是否Spring for Android提供了一些方法来公开一些用于 Cookie 管理的 API?就像RestTemplate为连接、连接工厂、消息转换器等公开一些抽象一样,我很乐意为 cookie 管理提供一些抽象。

4

2 回答 2

2

我自己没有使用过 Spring,但从我所读到的内容来看,它遵循官方的建议并根据 API 版本切换 HTTP 客户端(如果根据我的喜好严重过度设计的话,这非常聪明)。使用时HTTPUrlConnection,正如您所提到的,Spring 可能不会更改CookieHandler. 您应该看到内存中的 cookie 处理,因此在同一个应用程序运行中的所有请求都应该工作,但是当您关闭应用程序时 cookie 将被擦除。你能确认这是你看到的吗?

如果是这样,您所要做的就是创建一个新CookieManager实例,将其传递给自定义CookieStorenull使用CookiePolicy默认值。

不幸的是,持久存储不是内置的,但编写一个也不是特别困难。

编辑:请参阅此处了解使用的 CookieStore SharedPreferences(我自己还没有测试过)。

于 2013-07-23T22:05:24.243 回答
1

ClientHttpRequestInterceptor您需要为所有请求(例如设置内容类型、授权等)传递公共标头时,该类是一种很好的方法。据我了解,您希望为特定请求传递一些 cookie 值。你也可以通过HttpEntityHttpHeaders类来实现这一点。

    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.add("Cookie", "name=" + value);
    HttpEntity requestEntity = new HttpEntity(null, requestHeaders);
    ResponseEntity response = restTemplate.exchange(
      "http://server/service?...",
      HttpMethod.GET,
      requestEntity,
      Response.class);

Spring rest 模板不提供任何用于管理 cookie 的自我解决方案。该类CookieHandler由 Apache 提供,不是 spring 的一部分。REST 模板只是管理请求响应的基本解决方案,与 Spring Core 相比。

于 2013-07-24T08:42:19.550 回答