问题描述
最近尝试把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端口同样也是的。)我看大部分的博客,都没有指出上面这个配置的具体作用,而且每个人的方法都是完全一样的,这样就会误导别人了。因为每个人的需求是不一样的,当时我们很多人是不知道这个代码的具体作用的。而且,他们也不把代码的包名贴出来,这样也浪费了我不少的时间去导包。(有许多包中含有相同的类,有时候很难区分。)