为什么HTTP组件HttpClient删除Cookie值中的引号?

时间:2018-09-14 03:20:04

标签: cookies apache-httpclient-4.x apache-httpcomponents

我有一个使用https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore 4.4.7进行rest 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

它删除引号。

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

curl没有相同的行为。

2 个答案:

答案 0 :(得分:1)

环绕引号从此处的值中删除:

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

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

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

答案 1 :(得分:1)

question关于相反的行为。

我也发现了an explanation为什么Apache HTTP Client的行为正确(在RFC本身旁边)

HTTP State Management Mechanism RFC

更新

Apache HTTP客户端cookie parser的来源,还有一些tests的来源。链接指向master分支,可以根据需要自由填充以调整分支和提交版本。