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

使用Spring启动为 X 正向原型配置嵌入式 Jetty 9

荣曾笑
2023-03-14

我正在AWS中运行一个SpringBoot应用程序。应用程序在弹性负载平衡器(ELB)后面运行。ELB被配置为对外使用https(端口443(端口8080)传递给应用程序。ELB配置为通过x-forwarded-poto标头。我正在使用Jetty9.0.0.M0和Spring Boot1.1.5 RELEASE。

我似乎收到了通过ELB从应用程序发送回来的错误重定向,其中重定向响应以http而不是https的形式返回。现在,我在这里读到我应该使用“转发”标头设置为true

<Set name="forwarded">true</Set>

我无法看到如何在Spring启动中使用嵌入式版本的 Jetty 执行此操作,因为没有 XML 配置文件作为我的源代码的一部分。

我已经看过嵌入式Servlet容器客户端基础架构,但我仍然无法获得正确的咒语来使此设置正常工作。

应用程序是在AWShttps环境之外构建和测试的,因此应用程序也需要透明地使用超文本传输协议。无需通过ELB直接访问应用程序endpoint就可以工作。只是ELB到应用程序的路由不起作用。

有什么想法吗?


共有3个答案

贲宏硕
2023-03-14

这是我们刚刚使用的Spring应用程序jetty-runner-9.3.6.jar.在我们的例子中,我们的jetty.xml已经没有任何addConnector,尝试只添加addConnector会出错。

在这里找到的-https://github.com/george-hawkins/authsite/blob/2c5d61b984a328ef878216a3acfd0ad2593f81b1/src/main/config/etc/jetty.xml

  <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
    <Call name="addCustomizer">
      <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
    </Call>
  </New>

  <Call name="addConnector">
    <Arg>
      <New class="org.eclipse.jetty.server.ServerConnector">
        <Arg name="server"><Ref refid="Server" /></Arg>
        <Arg name="factories">
          <Array type="org.eclipse.jetty.server.ConnectionFactory">
            <Item>
              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
                <Arg name="config"><Ref refid="httpConfig" /></Arg>
              </New>
            </Item>
          </Array>
        </Arg>
        <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
      </New>
    </Arg>
  </Call>

这样做的目的是修改传递的请求对象,使它看起来像不是通过代理传递的(用任何可用和支持的X-Forwarded头替换细节)。

请参阅 http://archive.eclipse.org/jetty/9.0.0.M4/apidocs/index.html?org/eclipse/jetty/server/ForwardedRequestCustomizer.html

此定制器查看 HTTP 请求,以指示它已由一个或多个代理转发的标头。具体处理的有:

  • X-Forwarded主机
  • X-Forwarded服务器
  • X-Forward-For
  • X-Forwarded协议

如果这些标头存在,则更新Request对象,这样代理就不会被视为请求所来自的连接的其他终端

狄侯林
2023-03-14

我发现默认的Spring Boot Jetty配置有几个问题,尤其是SSLLabs Check不喜欢启用的SSL算法。

总之:我找到的解决方法是这样的:

   @Bean
   public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() 
   {
      // Deploy the nuclear option, kill the default Spring Boot factory
      // and replace with mine that disables extra crud.
      JettyEmbeddedServletContainerFactory fac = new JettyEmbeddedServletContainerFactory();
      // This allows ELB to work.
      fac.setUseForwardHeaders( true );
      return fac;
   }

如果您想要端到端SSL,还需要设置许多其他ELB选项。我不得不使用命令行客户端进行一些调整,并将健康检查更改为TCP:8443 b/c,负载平衡器认为EC2实例证书无效。

符棋
2023-03-14

我自己也有类似的问题,在研究过程中偶然发现了你的问题。我发现这很容易编程,但在Jetty文档中并没有真正解释。

Jetty xml配置文件的结构与javaAPI的结构相匹配,因此您可以在代码中复制它。

因此,请按照 Jetty 指南了解如何在此处使用 XML 配置文件进行配置

我能够像这样编程地配置嵌入式服务器:

    Server server = new Server( port );

    // Create HTTP Config
    HttpConfiguration httpConfig = new HttpConfiguration();

    // Add support for X-Forwarded headers
    httpConfig.addCustomizer( new org.eclipse.jetty.server.ForwardedRequestCustomizer() );

    // Create the http connector
    HttpConnectionFactory connectionFactory = new HttpConnectionFactory( httpConfig );
    ServerConnector connector = new ServerConnector(server, connectionFactory);

    // Make sure you set the port on the connector, the port in the Server constructor is overridden by the new connector
    connector.setPort( port );

    // Add the connector to the server
    server.setConnectors( new ServerConnector[] { connector } );
 类似资料:
  • 我想尝试使用嵌入式jmxtrans的基本入门示例。所以我添加了下面的代码 添加while循环是为了使应用程序保持最新状态,直到jvm统计信息打印到控制台上。这是jmxtrans。json文件 在启用调试级别日志时,我发现jmxtrans Spring bean没有创建,因为Spring循环引用错误 调试o. s. b. f. s.DefaultListableBeanFactory 1426-忽略

  • 我找不到任何可行的例子。实际上有一个,https://github.com/ekito/spring-boot-gwt,但是所有的依赖项和配置仍然处于战争状态。 有人能提出解决办法吗?

  • 尝试启动Tomcat时出现一个通用错误。下面是StackTrace: 下面是POM:http://maven.apache.org/maven-v4_0_0.xsd“>4.0.0 edu.rutgers spring-social-orcid-client-boot spring-social-orcid-client-boot 1.1.0 多谢了。

  • 这将启动一个嵌入式Tomcat实例,这很好。 问题是,其他配置文件不需要嵌入式服务器(例如,我使用JMS来处理传入的消息,而不是REST)。 有什么方法可以阻止在默认情况下启动Tomcat,并且只在REST配置类中使用它?例如,通过使用注释该类 谢谢

  • 我正在做一个测试项目,为我们未来的项目尝试SpringBoot。 我们正在使用jasig CAS,我正在尝试配置Spring Boot和嵌入式tomcat服务器。 所以我加入了pom。xml spring启动程序安全性 之后,我尝试配置WebSecurityConfig- 这里是第一个问题:类组织。springframework。安全中科院。网状物应用程序未重新确认CasAuthenticatio

  • 英文原文:http://emberjs.com/guides/configuring-ember/embedding-applications/ 大多数情况下,应用所有的UI都将通过路由器管理的模板来创建。 但是如果需要将一个Ember.js应用嵌入一个现有的网页,与其他的Javascript框架共存应该怎么做呢? 改变根元素 缺省情况下,应用将渲染应用模板到网页的body元素中。 通过指定roo