当前位置: 首页 > 知识库问答 >
问题:

如何在2个revese代理链之后强制主机名

薛承志
2023-03-14

Spring Boot应用程序托管在2个反向代理(链接)后面。

反向代理1--

并且主机和转发标头没有正确链接。有没有办法将主机强制为固定值?就像“反向代理1”的主机名一样?

共有1个答案

丁绪
2023-03-14

我已通过更改传入请求中的serverName修复了我的问题。

我为tomcat添加了一个阀:

public class HostForceValve extends ValveBase {

private final String proxyName;

public HostForceValve(String proxyName) {
    this.proxyName = proxyName;
}

@Override public void invoke(Request request, Response response) throws IOException, ServletException {
    org.apache.coyote.Request coyoteRequest = request.getCoyoteRequest();
    MimeHeaders mimeHeaders = coyoteRequest.getMimeHeaders();
    mimeHeaders.removeHeader("host");
    final MessageBytes host = mimeHeaders.addValue("host");
    host.setString(proxyName);
    request.setRemoteHost(proxyName);
    request.getCoyoteRequest().serverName().setString(proxyName);
    try {
        Valve next = getNext();
        if (null == next) {
            return;
        }
        next.invoke(request, response);
    } finally {
        request.setRemoteHost(proxyName);
    }

}
}

并将此值添加到tomcat嵌入式服务器:

@Component
public class MyTomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

@Value("${proxyName:}")
private String proxyName;

@Override
public void customize(TomcatServletWebServerFactory factory) {
    final Collection<Valve> currents = factory.getEngineValves();
    final ArrayList<Valve> addValves = new ArrayList<>(currents);
    if (StringUtils.hasLength(proxyName)) {
        addValves.add(0, new HostForceValve(proxyName));
    }
    factory.setEngineValves(addValves);
}
}
 类似资料:
  • Docker允许来自多个容器的服务器通过链接和服务发现相互连接。然而,据我所知,这个服务发现是主机本地的。我想实现一个使用其他托管在不同机器上的服务的服务。 在Docker中有几种方法可以解决这个问题,比如CoreOS的< code>jumpers,本质上代理其他机器的主机本地服务,以及一大堆用于管理Docker部署的github项目,这些项目似乎都试图支持这个用例。 鉴于发展速度,很难遵循当前的

  • 我想为SOCKS5代理设置列表,即应使用直接连接的主机名列表。 正如oracle文档所描述的,有名为<code>http的选项。非代理主机和用于为HTTP和FTP设置代理排除,但没有针对SOCKS代理的特定设置。 我尝试了,但这不影响SOCKS连接。 SOCKS代理通过以下方式设置: 但这会导致连到的DB连接都使用SOCKS代理,这是不可接受的 这应该如何使用?如何从代理连接中排除某些主机?

  • 谁能帮助我如何创建一个新的代理人,并将其链接到旧的,以治愈人民? 多谢!

  • 在Tomcat上运行JDK7应用程序时,它确实具有以下环境设置: 上面的设置确保我们在进行API调用等时通过HTTPS连接时不使用TLS 1.0。 我们还使用org.springframework.mail.javamail.JavaMailSenderImpl类发送传出的SMTP电子邮件,并使用以下道具: 问题是,升级到TLS1时,与SMTP电子邮件服务器的连接失败。2. javax。网ssl。

  • Spring AOP通过代理模式实现,目前支持两种代理:JDK动态代理、CGLIB代理来创建AOP代理,Spring建议优先使用JDK动态代理。 JDK动态代理:使用java.lang.reflect.Proxy动态代理实现,即提取目标对象的接口,然后对接口创建AOP代理。 CGLIB代理:CGLIB代理不仅能进行接口代理,也能进行类代理,CGLIB代理需要注意以下问题: 不能通知final方法,

  • 我有一个代码库,需要强大的名称。 起初,我认为这将是一个简单的解决方案,因为我只是简单地为所需的ServiceStack程序集指定了强名称。由于ServiceStack内部对弱命名程序集的相互依赖性,此操作失败。然后,我咬紧牙关,使用我的密钥文件重新编译ServiceStack——这是不可取的,因为我没有看到一种方法可以在单个位置完成这项工作,并且必须将其添加到每个项目中。 即使如此,由于以下原因