gpt4 book ai didi

java - 获取Tomcat中http端口对应的https端口号

转载 作者:行者123 更新时间:2023-11-28 21:53:49 25 4
gpt4 key购买 nike

我正在尝试最小化我的 webapp 的配置,我想删除的其中一件事是端口号映射:

  • 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>

上面的 block 告诉 servlet 容器将 http 请求重定向到它的 https 副本。显然,Tomcat 知道请求来自哪个连接器,在 server.xml 中查找该连接器的“redirectPort”属性并使用它构建 https URL。

根据这些先前/相关的问题,似乎没有标准的或特定于 tomcat 的方法来获取请求的相应 https 端口:

TL;DR:我的问题是,对于不安全请求获取相应的 https 端口号而不在您的 webapp 中明确配置它们,您有什么想法?

我的一个想法是使用与当前请求相同的端口号从 webapp 对其自身进行 http 调用,到达安全约束后面的路径,并从响应中解析重定向位置。当然,应该缓存响应。有没有更直接的方法?

编辑: 添加了一个 answer带有想法的代码。

最佳答案

如果有人想知道如何实现我在问题中提出的想法,这里有一些示例代码我放在一起进行测试。不过,我认为我不会采用此解决方案。

这适用于问题正文中的安全约束 block 。

private static final String HTTPS_CONSTRAINED_PATH = "/https";

private static ConcurrentHashMap<String, Integer> resolvedHttpsPortMap = new ConcurrentHashMap<String, Integer>();
private static final ReentrantLock portMapLock = new ReentrantLock();

public static int resolveHttpsPort(HttpServletRequest request) {
if (request.isSecure()) return request.getServerPort();
String key = request.getServerName() + ":" + request.getServerPort();
Integer port = resolvedHttpsPortMap.get(key);
if (port == null) {
portMapLock.lock();
try {
port = resolvedHttpsPortMap.get(key);
if (port == null) {
URL url = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), request.getContextPath() + HTTPS_CONSTRAINED_PATH);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (conn.getResponseCode() != 301 && conn.getResponseCode() != 302
&& conn.getResponseCode() != 303 && conn.getResponseCode() != 307) {
throw new IllegalStateException("Got unexpected response code " + conn.getResponseCode() + " from URL: " + url);
}
String location = conn.getHeaderField("Location");
if (location == null) {
throw new IllegalStateException("Did not get a Location header in the response from URL: " + url);
}
URL locationUrl = new URL(location);
port = locationUrl.getPort();
}
} catch (Exception e) {
logger.warn("Could not determine corresponding HTTPS port for '" + key + "'", e);
} finally {
if (port == null) port = -1;
resolvedHttpsPortMap.put(key, port);
portMapLock.unlock();
}
}
return port;
}

关于java - 获取Tomcat中http端口对应的https端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12412671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com