gpt4 book ai didi

spring - 在 Spring 中使用 ServletUriComponentsBuilder 构建没有端口号的 Url

转载 作者:行者123 更新时间:2023-12-02 07:57:45 25 4
gpt4 key购买 nike

我在服务类中使用 ServletUriComponentsBuilder 来构建一些 url,但问题是它还包含 servlet 容器运行的端口号,当我将应用程序部署在在代理服务器后面进行生产,该服务器应该仅在端口 80 上运行

我正在使用的代码是:

String sUri = ServletUriComponentsBuilder.fromCurrentContextPath().path("/student/edit/" + st.getId()).build().toUriString();

虽然我在 JSP 中使用的 c:url 工作得很好,但它不包含端口号。有什么方法可以让 ServletUriComponentsBuilder 也启动检测是否需要包含端口号。

意味着如果应用程序在端口 8080 上启动,则它可以包含端口号,但当从端口 80 访问应用程序时,则不包含端口号?

发生了什么:如果我的 tomcat 在端口 8080 上运行,而我有代理服务器在端口 80 上处理请求,但由 ServletUriComponentsBuilder 构建的 URL 仍然附加端口 8080 在主机之后,我需要它是 80

最佳答案

看看ServletUriComponentsBuilder#fromRequest :

String scheme = request.getScheme();
int port = request.getServerPort();
String host = request.getServerName();

String header = request.getHeader("X-Forwarded-Host");

if (StringUtils.hasText(header)) {
String[] hosts = StringUtils.commaDelimitedListToStringArray(header);
String hostToUse = hosts[0];
if (hostToUse.contains(":")) {
String[] hostAndPort = StringUtils.split(hostToUse, ":");
host = hostAndPort[0];
port = Integer.parseInt(hostAndPort[1]);
}
else {
host = hostToUse;
}
}
....

尤其是那条线

String header = request.getHeader("X-Forwarded-Host");

就可以了。您所要做的就是设置 X-Forwarded-Host在代理服务器中并开始使用 ServletUriComponentsBuilder#fromRequest 而不是 ServletUriComponentsBuilder#fromCurrentContextPath。您的网址应包含您的公共(public)代理主机名,但不包含端口。

关于spring - 在 Spring 中使用 ServletUriComponentsBuilder 构建没有端口号的 Url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21495555/

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