我有一个使用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
没有相同的行为。
答案 0 :(得分:1)
环绕引号从此处的值中删除:
从外观上,您可以用引号将引号引起来。在发出重定向请求之前,请遍历所有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
分支,可以根据需要自由填充以调整分支和提交版本。