spring cloud/spring boot同时支持http和https访问

前言

  关于 spring boot 同时支持 http 和 https 访问,在 spring boot 官网73.9已经有说明文档了,同样在 github 上也有官网的例子

  在这里,我向大家讲述一下,我是怎么实现的。

方式一

 一、相关配置

server:
  port: 4000

https:
port: 8443
ssl:
key
-store: classpath:sample.jks
key
-store-password: secret
key
-password: password

可以看到,只是简简单单添加端口的信息,sample.jks 可以自己生成(记得对应密码),也可以在官网例子里面下载

 二、spring boot 启动文件读取配置信息(注:请添加必要的 jar)

@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) throws Exception {
    SpringApplication.run(GatewayApplication.class, args);
}

</span>@Value(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${https.port}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
private Integer port;

</span>@Value(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${https.ssl.key-store-password}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
private String key_store_password;

</span>@Value(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${https.ssl.key-password}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
private String key_password;<br>  <br>  /* --------------------请按照自己spring boot版本选择 start--------------------- */<br></span></pre>
  // 这是 spring boot 1.5.X 以下版本的 添加了这个,下一个就不用添加了
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        tomcat.addAdditionalTomcatConnectors(createSslConnector()); // 添加 http
        return tomcat;
    }
  
  // 这是 spring boot 2.0.X 版本的 添加这个,上一个就不用添加了
  @Bean
  public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addAdditionalTomcatConnectors(createSslConnector()); // 添加 http
    return tomcat;
  }
  /* ------------------- 请按照自己 spring boot 版本选择 end---------------------- */
 
 
  // 配置 https private Connector createSslConnector() { Connector connector
= new Connector("org.apache.coyote.http11.Http11NioProtocol"); Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); try { File keystore = new ClassPathResource("sample.jks").getFile(); /*File truststore = new ClassPathResource("sample.jks").getFile();*/ connector.setScheme("https"); connector.setSecure(true); connector.setPort(port); protocol.setSSLEnabled(true); protocol.setKeystoreFile(keystore.getAbsolutePath()); protocol.setKeystorePass(key_store_password); protocol.setKeyPass(key_password); return connector; } catch (IOException ex) { throw new IllegalStateException("can't access keystore: [" + "keystore" + "] or truststore: [" + "keystore" + "]", ex);} } }

启动项目后,可以看到两个端口,说明已经成功

方式二

  一、相关配置

server:
  port: 8443
  ssl:
    key-store: classpath:sample.jks
    key-store-password: secret
    key-password: password

http:
port: 8080

  二、spring boot 启动文件读取配置信息(注:请添加必要的 jar)

@SpringBootApplication
public class SampleTomcatTwoConnectorsApplication {
</span>@Value(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${http.port}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
private Integer port;


  /* -------------------- 请按照自己 spring boot 版本选择 start--------------------- */
  
  // 这是 spring boot 1.5.X 以下版本的 添加了这个,下一个就不用添加了
@Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加 http return tomcat; }
  
  // 这是 spring boot 2.0.X 版本的 添加这个,上一个就不用添加了
  @Bean
  public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加 http
    return tomcat;
  }
/* -------------------- 请按照自己 spring boot 版本选择 end--------------------- */
 

  // 配置 http private Connector createStandardConnector() { Connector connector
= new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setPort(port); return connector; } public static void main(String[] args) throws Exception {SpringApplication.run(SampleTomcatTwoConnectorsApplication.class, args); } }

启动项目后,可以看到两个端口,说明已经成功

 

总结

  对比两种方法可以看出方式二比方式一简单一点,主要是因为方式二用的代码比较少,我也不知道这两种方式有什么区别,我自己测试过,无论是 spring boot 还是 spring cloud, 这两个方式都没问题,就算是方式二,同样可以帮服务注册到 eureka 上。不一样的是方式一注册到 eureka 的端口是 4000,方式二注册到 eureka 的端口是 8443。作为一个强迫的人士,在我自己的项目上,用的方式二,因为我的 eureka 用的 http 注册服务。如果你只是 spring boot,当然选择少一点代码的方式二啦。

  这只是我在做项目时,遇到的需求,拉出来给大家分享,如果发现问题,请大家提一下意见,让我完善一下,谢谢