cur*_*rd0 5 java https redirect apache-httpclient-5.x
我正在寻找如何在Apache HttpClient 5.1中将 POST 请求重定向为 POST
\n默认情况下,仅自动遵循导致重定向的GET请求。如果POST请求得到 HTTP 301(永久移动)或 302(临时移动)\xe2\x80\x93 的响应,则不会自动遵循重定向。这是由HTTP RFC 2616指定的
\n但是,在某些情况下,必须将 POST 请求重定向为 POST。在这种情况下,必须更改默认行为才能放宽严格的 HTTP 规范。
\n使用Apache HttpClient 4.5 ,可以通过将DefaultRedirectStrategy替换为LaxRedirectStrategy或使用您自己的RedirectStrategy接口的自定义实现来轻松实现这一点。例子:
\n在Apache HttpClient 5.1中,这不再起作用。RedirectStrategy接口已更改,不再包含getRedirect方法,LaxRedirectStrategy实现也已删除。
\n有没有办法覆盖Apache HttpClient 5.1中的默认 POST 重定向行为,与HttpClient 4.5类似或简单?
\n由于到目前为止没有人回复,我将发布我自己的发现作为答案。
我公司处理文件上传的一台内部服务器必须从 HTTP 转换为 HTTPS。附加要求是:如果有人忘记更新其 URL 并使用 HTTP 上传文件 - 他们的上传也必须正确重定向到 HTTPS 并进行处理。
使用HttpClient 4.5很容易做到这一点(请参阅原始问题),但使用HttpClient 5.1。如果客户端通过 HTTP 向 HTTPS 服务器发送 POST 请求 - 它们会被重定向(301 永久移动),POST 会转换为 GET,然后被服务器拒绝。
检查源代码,我发现在5.1版本中,HttpClient 开发人员决定严格执行HTTP RFC 2616,并消除了覆盖或放宽重定向策略的可能性。
在HttpClient 5.1.x中,请求重定向由RedirectExec类处理,其中针对某些状态代码(302、302、303)将POST替换为GET的逻辑是硬编码的:
这使得客户端解决方案相当麻烦且昂贵。但是,由于我可以完全控制服务器,所以我决定在服务器端解决问题。
这是通过重新配置 NGNIX 服务器在 HTTP 到 HTTPS 重定向上返回“308 Permanent Redirect”而不是默认的“301 Moved Permanently”来完成的
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 308 https://$host$request_uri;
}
Run Code Online (Sandbox Code Playgroud)
不完全是我所希望的解决方案,但非常适合我的用例,并且比编写RedirectExec的自定义实现简单得多
| 归档时间: |
|
| 查看次数: |
2394 次 |
| 最近记录: |