【问题标题】:Java Springboot on HTTPS: how to change default http port 8080 to another valueHTTPS 上的 Java Spring Boot:如何将默认 http 端口 8080 更改为另一个值
【发布时间】:2019-12-22 10:13:40
【问题描述】:

您好 Java 和 Springboot 专家,

这是关于我使用 springboot 在 Java 中创建的一个项目。
我能够在 Spring Boot 中成功创建和设置一个 https 项目。 然后设置 HTTPS 端口,我只需通过命令行设置而不是 application.properties 通过终端中的此命令:

$ java -Dserver.port=6001 -jar myapp-0.0.1.jar

我这样做是为了让我可以轻松地创建将在其他端口运行的其他实例,比如 6002、6003 等等...

但问题是,tomcat设置了这个默认的HTTP端口:

2019-08-16 02:42:36.768  INFO 6 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 6001 (https) 8080 (http)

我想摆脱它,或者将它分配给另一个端口,例如6081.
我已阅读此article,并以编程方式对其进行设置。
但我想避免这种情况。
我只是希望它是我可以在命令行中添加为参数的东西,例如 -Dserver.port=6001。尽可能避免使我的项目进一步复杂化。
我试过这样做:

$ java -Dserver.port=6001 -Dserver.http.port=6081 -jar myapp-0.0.1.jar


...但它不起作用。

您的想法和意见将不胜感激!

【问题讨论】:

  • server.http.port 不再受支持。你有配置 tls/ssl 吗?
  • @ChrisMaggiulli... 是的,事实上它已经是一个工作的 https 服务器了。
  • 我没有先阅读您的整个帖子。如果您不使用属性,则需要使用 Java Config。你想在 80 上设置 ngix 服务器或 httpd 服务器,通过 AJP 将 https 请求转发到 Spring。还是您想直接通过 https 公开您的 Spring Boot 服务器而不需要 Web 服务器?
  • @ChrisMaggiulli,一切都好。这实际上是一个封装了 Angular 前端的 Web 服务器。这意味着,它不会与它前面的任何服务器进行交互。这将是前端 Web 服务器。我们只是使用 http 端点,完全忽略了 http:8080。我已经像“myapp:443”一样访问了这个网络服务器。我可以忽略 http:8080,但问题是每次我生成另一个实例时,它也有一个 http 端口 8080。如果我可以摆脱每个实例的 http 端口,或者至少设置每个 http 端口号唯一。比如6081、6082等

标签: java spring-boot http tomcat https


【解决方案1】:

您是否尝试在 application.properties 中设置 server.port=-1。见Spring Boot doc

[更新]

您可以将您的 HTTP 重定向到 HTTPS。

要实现这一点,您需要另一个连接器。 SpringBoot 不允许使用 application.properties 配置多个连接器。所以我们可以通过编程方式编写一个连接器。 Tomcat 的连接器示例:

@Configuration
public class MyTomcatConnector {

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };  
        tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
        return tomcat;
    }  
    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(6001);
        return connector;
    }
}

【讨论】:

  • 我不确定这一点,但使用那个参数......这就是我设置我的 https 端口的地方。 “$java -Dserver.port=6001 -jar myapp-0.0.1.jar”已经在 https 上运行。恐怕如果我这样做,它会关闭我的 https 端口,或者我的 https 端口将是未知的任意值。但最重要的是,鉴于您的解决方案?我现在如何设置我的 https 端口?
  • 对不起,我之前误解了你的问题。我现在已经更新了我的答案。检查是否有效。
  • 一切都好。是的,在我在这里发布我的问题后,我遇到了那个问题。我想我别无选择,只能以编程方式设置端口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2014-06-26
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多