2015-02-04 3 views
5

Как настроить Jetty с соединителем SSL в Spring Boot 1.2.x?Jetty с SSL в Spring Boot 1.2.1

Следующая конфигурация работает для Spring boot 1.1.6, но дает . SslSocketConnector не может быть разрешен к ошибке типа для версии 1.2.1.

@Configuration 
@EnableAutoConfiguration 
public class OptosoftOAuthSecurityApplication implements 
     EmbeddedServletContainerCustomizer { 

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

    @Override 
    public void customize(ConfigurableEmbeddedServletContainer container) { 
     if (container instanceof JettyEmbeddedServletContainerFactory) { 
      customizeJetty((JettyEmbeddedServletContainerFactory) container); 
     } 
    } 

    public void customizeJetty(
      JettyEmbeddedServletContainerFactory containerFactory) { 
     containerFactory.addServerCustomizers(jettyServerCustomizer()); 
    } 

    @Bean 
    public JettyServerCustomizer jettyServerCustomizer() { 
     return new JettyServerCustomizer() { 

      @Override 
      public void customize(Server server) { 
       SslContextFactory sslContextFactory = new SslContextFactory(); 
       sslContextFactory.setKeyStorePassword("jetty6"); 
       try { 
        sslContextFactory.setKeyStorePath(ResourceUtils.getFile(
          "classpath:jetty-ssl.keystore").getAbsolutePath()); 
       } catch (FileNotFoundException ex) { 
        throw new IllegalStateException("Could not load keystore", 
          ex); 
       } 

       // THIS CLASS cannot be resolved !!!!!! 
       SslSocketConnector sslConnector = new SslSocketConnector(
         sslContextFactory); 
       sslConnector.setPort(9443); 
       sslConnector.setMaxIdleTime(60000); 
       server.addConnector(sslConnector); 
      } 
     }; 
    } 

    @Bean 
    @ConditionalOnMissingBean(RequestContextListener.class) 
    public RequestContextListener requestContextListener() { 
     return new RequestContextListener(); 
    } 
} 

Мой pom.xml (Spring загрузки версии 1.2.1 в родительском ПОМ): -

<dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
      <exclusions> 
       <exclusion> 
        <artifactId>spring-boot-starter-tomcat</artifactId> 
        <groupId>org.springframework.boot</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jetty</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security.oauth</groupId> 
      <artifactId>spring-security-oauth2</artifactId> 
     </dependency> 
    </dependencies> 

ответ

8

, который вы пытаетесь использовать класс специфичен для Jetty 8, но Spring ботинке 1.2. x по умолчанию использует Jetty 9. В Spring Boot 1.2 вы можете теперь настроить SSL декларативно в application.properties. Это проиллюстрировано в spring-boot-sample-jetty-ssl.

Вы можете заменить EmbeddedServletContainerCustomizer реализации со следующими свойствами, объявленных в application.properties:

server.port = 9443 
server.ssl.key-store = classpath:jetty-ssl.keystore 
server.ssl.key-store-password = jetty6 

Spring Загрузочный поддерживает только декларативную конфигурацию одного разъема. Если вы хотите, чтобы сервер был доступен через HTTP и HTTPS, вам нужно будет настроить один из них программным путем. Я бы рекомендовал, чтобы HTTP-коннектор был настроен программно, так как здесь задействован меньше кода:

@Bean 
public EmbeddedServletContainerCustomizer servletContainerCustomizer() { 
    return new EmbeddedServletContainerCustomizer() { 

     @Override 
     public void customize(ConfigurableEmbeddedServletContainer container) { 
      if (container instanceof JettyEmbeddedServletContainerFactory) { 
       configureJetty((JettyEmbeddedServletContainerFactory) container); 
      } 
     } 

     private void configureJetty(JettyEmbeddedServletContainerFactory jettyFactory) { 
      jettyFactory.addServerCustomizers(new JettyServerCustomizer() { 

       @Override 
       public void customize(Server server) { 
        ServerConnector serverConnector = new ServerConnector(server); 
        serverConnector.setPort(8080); 
        server.addConnector(serverConnector); 
       } 
      }); 
     } 
    }; 
} 
+0

Как указать порт HTTP? –

+0

Вы хотите настроить HTTPS и HTTP-доступ? –

+0

Да. Мне нужны оба. –