首页 > 解决方案 > 为什么 http 组件 HttpClient 会从 Cookie 值中删除引号?

问题描述

我有一个使用https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore 4.4.7 进行休息 api 调用的应用程序。

我有一种情况,我要针对安全的 Web 应用程序创建 API:

HTTP GET 请求 1:https ://myapp.com/api/myrestrequest

它发现我缺少一个 JESSIONID cookie,因此它通过 302 将我发送到另一个页面以获取一个:

302 GET 请求 2:https ://myapp.com/sso/dologin?referer=/api/myrestrequest

此页面读取我的 SSO 会话 cookie,然后将我发送回原始请求:

HTTP GET 请求 3:https ://myapp.com/api/myrestrequest

很简单,很正常。但是在 GET 请求 2 期间,创建了一个特殊的 cookie,如下所示:

J-Login-Cookie="a8966ab6c6d65a7d6a"

但是当 HTTP 客户端将此 cookie 保存到 cookie 存储时,它会像这样保存它:

J-Login-Cookie=a8966ab6c6d65a7d6a

它删除引号。

这是为什么?我必须使用 anHttpRequestInterceptor将我的引号添加回 cookie 值,以便请求 3 不会失败。有没有办法让它停止删除这些引号?

curl没有这种相同的行为。

标签: cookiesapache-httpclient-4.xapache-httpcomponents

解决方案


周围的引号从此处的值中删除:

https://android.googlesource.com/platform/libcore/+/android-cts-7.0_r1/ojluni/src/main/java/java/net/HttpCookie.java#1110

从外观上看,您可以用撇号将引用的值括起来。在发出重定向请求之前,遍历所有要查找的 cookieJ-Login-Cookie并将值从 更改为"a8966ab6c6d65a7d6a"'"a8966ab6c6d65a7d6a"'以便仅删除外部撇号。

这与使用拦截器基本相同。您唯一的其他选择是使用不同的 HTTP 客户端库。


推荐阅读