Spring Boot RestTemplate请求出现重复Cookie头如何解决?
出现两个Cookie头的核心原因是:RestTemplate默认依赖的HttpClient库中,RequestAddCookies拦截器会自动从CookieStore中读取Cookie并添加到请求头里,和你手动设置的自定义Cookie产生冲突。以下是几种可行的解决办法:
方法一:移除RequestAddCookies拦截器
自定义RestTemplate时,直接从HttpClient的拦截器列表中移除这个自动添加Cookie的拦截器:
@Bean public RestTemplate customRestTemplate() { HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); // 过滤掉自动添加Cookie的拦截器 List<HttpRequestInterceptor> interceptors = httpClientBuilder.getInterceptors(); interceptors.removeIf(interceptor -> interceptor instanceof RequestAddCookies); CloseableHttpClient httpClient = httpClientBuilder.build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); return new RestTemplate(requestFactory); }
方法二:禁用HttpClient的自动Cookie管理
直接关闭HttpClient的Cookie自动管理功能,让RequestAddCookies拦截器没有Cookie可添加:
@Bean public RestTemplate customRestTemplate() { CloseableHttpClient httpClient = HttpClientBuilder.create() .disableCookieManagement() // 禁用自动Cookie管理 .build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); return new RestTemplate(requestFactory); }
方法三:修改已存在的默认RestTemplate配置
如果项目中已经使用了默认的RestTemplate实例,可以通过@PostConstruct初始化时修改其底层HttpClient配置:
@Autowired private RestTemplate restTemplate; @PostConstruct public void adjustRestTemplateCookieConfig() { HttpComponentsClientHttpRequestFactory factory = (HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory(); CloseableHttpClient httpClient = (CloseableHttpClient) factory.getHttpClient(); HttpClientBuilder builder = HttpClientBuilder.create().setHttpClient(httpClient); builder.getInterceptors().removeIf(interceptor -> interceptor instanceof RequestAddCookies); factory.setHttpClient(builder.build()); }
以上三种方法都能有效阻止HttpClient自动添加额外Cookie,之后你手动在RequestEntity中设置的自定义Cookie会成为请求中唯一的Cookie头。
内容的提问来源于stack exchange,提问作者Akash Shinde
相关产品推荐
相关产品推荐

