我有一个向 Web 服务发送请求的应用程序。不幸的是,该应用程序已编译并且指向 Web 服务的链接作为 http 嵌入到应用程序中。 (是的,我知道那有多蠢,我没有写)
最近3rd party公司不再允许http请求,一切都必须是https。
该应用程序在 Tomcat 上作为 Web 应用程序运行。服务器是windows服务器。
有没有办法拦截对这个网络服务的调用并强制它使用 https?
最佳答案
因为你不能改变应用程序的源代码(因为它是编译好的),你也不能改变网络服务(因为它是第 3 方),解决这个问题的唯一方法是制作 应用程序和网络服务之间的代理。为此,您需要(假设代理在本地主机中运行):
- 由于 Web 服务 URL 嵌入到已编译的应用程序中,为了让应用程序向我们的代理发送 HTTP 请求,需要更改主机映射(例如
/etc/hosts
)以覆盖 DNS。例如,如果应用程序中的 HTTP 请求是GET http://example.com/api/sample
,则在/etc/hosts
中,example.com
需要映射到127.0.0.1
。 - 在本地创建一个代理网络服务器,并打开与网络服务相同的端口。这个代理是一个非常简单的网络服务器(任何后端编程技术都可以做到),它只负责请求转发。这样,当应用程序向
example.com
发送HTTP请求时,它会将请求发送给代理服务器。 - 代理服务器收到来自应用程序的 HTTP 请求后,提取请求 URL/header/body 并将 HTTPS 请求发送到
example.com
的真实 IP 地址。请注意:在此 HTTPS 请求中,应添加值为example.com
的 headerhost
。第 3 方网络服务可能会检查此 header 。 - 当
example.com
返回真正的响应后,proxy会返回给应用。
当然,您也可以使用逆向工程(Java反编译器)获取应用程序的“源代码”,更改网络服务URL,然后再次编译为网络应用程序。但是,由于应用程序可能需要更新/升级并且它可能不在您的控制之下,因此不建议使用这种逆向工程方法。
关于apache - 有没有办法强制应用程序使用 https 而不是 http 发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858365/