我试图尽量减少我的web应用程序的配置,和我想删除的事情之一是端口号映射:获取相应的HTTPS端口号HTTP端口在Tomcat中
- HTTP:80 - > HTTPS:443
- HTTP:9080 - > HTTPS:9443
由于配置已经在的conf/server.xml中存在,我不希望我的应用程序重复这些设置。必须改变(并记住改变)多个配置文件是一种痛苦。此外,只要它支持http和https,应用程序不应该关心它部署到的环境/容器。
我有以下的在我的web.xml中配置,但我需要能够建立除HTTPS URL来重定向:
<security-constraint>
<web-resource-collection>
<web-resource-name>secure</web-resource-name>
<url-pattern>/https/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
以上块告诉servlet容器的HTTP请求重定向到其https对应。显然,Tomcat知道请求来自哪个连接器,查找该连接器的server.xml中的“redirectPort”属性并使用该URL来构建https URL。
根据这些以前的/相关的问题,似乎没有要得到相应的HTTPS端口的请求的标准或特定的Tomcat方式:
- Tomcat: how to get the secure port number in Java?
- get server name and port number of JSP page for HTTPS
TL; DR:我的问题是,您有什么想法获得相应的https端口号为不安全的请求,而无需在您的webapp中明确配置它们?
我有一个想法是从webapp到自身到使用与当前请求相同的端口号的安全约束后面的路径进行http调用,并从响应中解析重定向位置。当然,这些回复应该被缓存。有更直接的方法吗?
编辑:增加了一个answer与该想法的代码。
嗨EJP,请考虑一个不安全的主页包含注册表单的情况(例如http://facebook.com,http://twitter.com)。如何在不知道https端口的情况下生成表单操作的https URL(如果它不是443)? Tomcat重定向是不够的,因为用户在他/她被重定向到安全URL之前将不安全地发布他/她的数据。 – andy