当前位置: 首页 > 知识库问答 >
问题:

Android-Spring rest模板管理cookie

上官修文
2023-03-14

我在一个项目中使用Spring for Android,我需要管理cookie商店/经理。我可以通过使用ClientHttpRequestInterceptor的实现向任何请求添加cookie,但我希望在发送请求时删除其中一些cookie。

更具体地说,我面临的问题是,对于Froyo,在Spring中特定的实现(带有DefaultHttpClient)会自动将来自CookieStore的cookie添加到头-即使我明确设置了头。但是我想自己管理这些cookie(要么删除其中的一些,要么更新它们的值)。而对于上面的姜饼(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管理提供一些抽象。

共有2个答案

康锦
2023-03-14

当您需要为所有请求传递公共头时,clienthttpprequestinterceptor类是一种很好的方法,例如设置内容类型、授权等。据我所知,您希望为特定请求传递一些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的一部分。与spring core相比,Rest模板只是管理请求-响应的基本解决方案。

徐阳炎
2023-03-14

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

如果是这样,您只需创建一个新的CookieManager实例,为CookiePolicy传递一个自定义CookieStorenull,以使用默认值。

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

编辑:有关使用SharedReferences(我自己还没有测试过)的CookieStore,请参见此处。

 类似资料:
  • 在本章中,我们将研究Joomla中的Template Manager 。 它管理网站中使用的各种模板。 可以在不改变网站内容结构的情况下使用模板。 模板管理器 以下是在Joomla中编辑模板管理器的简单步骤。 Step (1) - 单击Extensions → Template Manager ,如下所示。 Step (2) - Template Manager:Styles页面显示如下。 在这里

  • 我有两项服务-和<代码>服务1通过SpringREST模板调用一些API。现在

  • 什么是模板 你一定听说过一种叫做MVC的设计模式,Model处理数据,View展现结果,Controller控制用户的请求,至于View层的处理,在很多动态语言里面都是通过在静态HTML中插入动态语言生成的数据,例如JSP中通过插入<%=....=%>,PHP中通过插入<?php.....?>来实现的。 通过下面这个图可以说明模板的机制 图7.1 模板机制图 Web应用反馈给客户端的信息中的大部分

  • 和ErrorHandler类: 问题是,如果我在RestExample.add方法中添加一个“Throw new RuntimeException”,那么RestErrorHandler类将正确处理该异常。 但是,当将一个无效的请求向控制器卷取时,RestErrorHandler不会捕获验证器抛出的异常,而我会收到一个400BadRequest响应。(对于无效请求,我指的是未指定用户名的xml请求

  • Flarum 管理面板是一个用户友好的论坛管理界面。 它只对「管理」组 的用户开放。 要进入管理界面,只需点击屏幕右上方您的 用户名, 选择 后台管理 即可。

  • 在我的Spring Boot项目中,我在application-dev.yml文件中设置了几个endpoint(它们引用一些GET或POST REST API)。 我想用一个方法在一个服务类中管理这些endpoint。目前我已经实现了这个解决方案: 我希望使用一个单一的方法,使其尽可能具有通用性,特别是当我必须管理大量endpoint时。你有什么想法吗?提前致谢