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

spring boot定制Jetty SSLContextFactory

郤玉书
2023-03-14

通过阅读Spring Boot文档,定制Jetty服务器的标准方法似乎是实现如下类:

  @Component
  public class JettyServerCustomizer 
      implements WebServerFactoryCustomizer<JettyServletWebServerFactory> {

  @Autowired
  private ServerProperties serverProperties;

  @Override
  public void customize(final JettyServletWebServerFactory factory) {
      factory.addServerCustomizers((server) -> {
          // Customize 
      });
  }

}

我特别感兴趣的是修改SSLContextFactory。

在调用自定义程序之前跟踪spring-boot代码,ssl配置为:

if (getSsl() != null && getSsl().isEnabled()) {
    customizeSsl(server, address);
}
for (JettyServerCustomizer customizer : getServerCustomizers()) {
    customizer.customize(server);
}

CustizeSsl是一个私有方法,因此不能轻易覆盖:

private void customizeSsl(Server server, InetSocketAddress address) {
    new SslServerCustomizer(address, getSsl(), getSslStoreProvider(), getHttp2()).customize(server);
}

一种选择是在自定义程序中自己创建上下文工厂和连接器,然后覆盖服务器上的连接器。这可能可行,但感觉我们正在重新创建spring boot已经在做的一堆代码,以便能够在SSLContextFactory上调用一个方法。

似乎如果我们能够以某种方式提供我们自己的SslServerCustomizer,那么我们就可以进行我们想要的自定义配置。

有谁知道更好的方法吗?

共有1个答案

秦楚
2023-03-14

在我的情况下,它的工作原理如下:

@SpringBootApplication
@ComponentScan(basePackages = { "org.demo.jetty.*" })
public class DemoWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoWebApplication.class, args);
    }

    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
        JettyServletWebServerFactory factory = new JettyServletWebServerFactory();
        factory.setContextPath("/demo-app");
        factory.addServerCustomizers(getJettyConnectorCustomizer());
        return factory;
    }

    private JettyServerCustomizer getJettyConnectorCustomizer() {
        return server -> {

            final HttpConfiguration httpConfiguration = new HttpConfiguration();
            httpConfiguration.setSecureScheme("https");
            httpConfiguration.setSecurePort(44333);

            SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
            sslContextFactory.setKeyStoreType("PKCS12");
            sslContextFactory.setKeyStorePath("C:/jetty-demo/demo_cert.p12");
            sslContextFactory.setKeyStorePassword("*****");
            sslContextFactory.setKeyManagerPassword("****");

            final HttpConfiguration httpsConfiguration = new HttpConfiguration(httpConfiguration);
            httpsConfiguration.addCustomizer(new SecureRequestCustomizer());
            ServerConnector httpsConnector = new ServerConnector(server,
                    new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
                    new HttpConnectionFactory(httpsConfiguration));
            httpsConnector.setPort(44333);

            server.setConnectors(new Connector[] { httpsConnector });
            server.setStopAtShutdown(true);
            server.setStopTimeout(5_000);
        };
    }
}

您还可以定义一个HTTP连接器并将其添加到自定义部分

...
ServerConnector connector = new ServerConnector(server);
    connector.addConnectionFactory(new HttpConnectionFactory(httpConfiguration));        
    connector.setPort(8081);

server.setConnectors(new Connector[]{connector, httpsConnector});
...
 类似资料:
  • 我有一个简单的SpringBoot应用程序,其结构如下: 我使用的是标准应用程序。yml文件,其中存储了所有必要的道具,并在必要时使用@ConfigurationProperties注释注入它们。 现在对于一个bean,我有很多道具,我不想压倒我的普通应用程序。yml文件和所有的道具。所以我想要一个单独的(我把它放在类路径中的service dir下)。 根据Spring文档,我可以使用这样的东西

  • 10.1 配置日志 10.1.1 在配置文件中配置 在application.properties中添加 server.tomcat.accesslog.enabled=true server.tomcat.accesslog.directory=d:/temp/logs 10.2 EmbeddedServletContainerCustomizer接口,通过代码配置tomcat package

  • 搜索了一些类似案例未解决,问题出在哪里? 1.> 错误提示: Failed to bind properties under 'mapper' to tk.mybatis.mapper.entity.Config: Action: Update your application's configuration pom.xml ,重点关注 “tk.mybatis” application.prope

  • 此配置显示所有控制器,如何在 Swagger 上仅显示特定的控制器?

  • 我的Spring Boot应用程序有一个文件application.yml,它不愿意运行。 根据日志,元素[simulator.geo.b12,simulator.geo.b13,simulator.geo.b21,simulator.geo.c6,simulator.geo.host]未绑定的原因。然而,这个属性是在application.yml设置的,编译器甚至会返回它的值。 如果有人能帮我解

  • 本文向大家介绍springboot中自定义异常以及定制异常界面实现过程解析,包括了springboot中自定义异常以及定制异常界面实现过程解析的使用技巧和注意事项,需要的朋友参考一下 不多说废话,直接进入主菜!! 步骤: 1.搭建SpringBoot的开发环境,略(有不会的可以私信我)。 2.编写一个自定义异常,自定义异常需要继承RuntimeException。写一个构造函数,并调用父类保存异常

  • 问题内容: 我正在尝试使用Spring Boot在本地设置DynamoDB。最初,我开始进行设置,并能够通过存储库将其写入/保存到DynamoDB。从那时起,我添加了更多类来构建我的应用程序。现在,当我尝试启动应用程序时,出现以下异常: 我已经广泛搜索了SO和Internet,但是对此没有任何有用的解决方案。该错误消息也具有误导性。 我的项目属于以下层次结构 DynamoDBConfig.java

  • 我有一个应用程序有多个mongo配置。这是通过一些@Configuration类实现的,比如 配置1——应用程序 配置2--测试 然后在我的房子里 因此,两个mongo配置连接到本地运行但具有不同数据库的实例。我也尝试过使用不同的地址,但它的行为相同。 不管怎么说,这将通过实体和MongoRepository来使用 回购 然而,当我在某个地方的课堂上使用它时 此对象被写入,而不是我所期望的,因为它