SpringBoot部署SSL出现Address alread in use问题

问题描述

最近尝试把springboot项目部署到服务器上,因为需要配置SSL证书,所以就去查资料,按照网络上的方法进行配置,当是最终还是失败了。出现了一个异常,主要是这个:BindException 异常。
在这里插入图片描述

问题代码

首先是申请阿里云证书(或者通过其它方法得到证书),然后将证书复制到resource同级目录,并且在application.properties或者application.yml文件中配置相关的信息。最后是在启动类中加入下面的这段代码。前面的步骤,基本上都没有问题,当时就是这段代码导致了出错。

package com.item;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;

import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling   //开启定时任务
@MapperScan(basePackages = "com.item.mapper")
@SpringBootApplication
public class EvaluatesystemApplication {

	public static void main(String[] args) {
		SpringApplication.run(EvaluatesystemApplication.class, args);
	}
	
	@Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @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(redirectConnector());
        return tomcat;
    }
    
	
	/*  地址被占用异常 是由这个方法引起的。
    private Connector redirectConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(80);     //80端口被占用了
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }
	*/
}

错误分析

被我注释的这段代码的作用是将http的请求,重定向到https。也就是说同时为应用程序配置http和https协议。所以,这个springboot项目启动时,会同时监听80 和 443两个端口,当然了取决于你设置的http端口和https的端口,这里使用的是协议默认的端口。 但是由于我部署的服务器上,已经有一个服务占据了80端口,导致产生了冲突。所以产生了这个端口绑定异常。

错误解决

注释这段代码即可,或者将http的端口设置为一个不冲突的端口。(注意一定要保证端口不对其它程序占用 ,443端口同样也是的。)我看大部分的博客,都没有指出上面这个配置的具体作用,而且每个人的方法都是完全一样的,这样就会误导别人了。因为每个人的需求是不一样的,当时我们很多人是不知道这个代码的具体作用的。而且,他们也不把代码的包名贴出来,这样也浪费了我不少的时间去导包。(有许多包中含有相同的类,有时候很难区分。)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值