我的需求
我想要到达到的效果是
1.强制https访问
访问主页时,即使访问链接带http而不带https,也会自动跳到https
2.80端口自动转发到443端口
我的项目是单应用部署,直接java -jar来跑的,服务器不挂nginx或者tomcat ,并且做了域名解析,网址映射的是默认的80端口
所以我要做的是 先想让springboot项目监听443端口,然后加载证书,然后https的请求就能正常访问了
然后想办法让所有通过80端口的请求引流到443端口
1.在腾讯云申请证书并下载证书
2.复制证书并配置application.yml
把 证书文件里面的 xxx.com.jks 复制到 项目resources目录里
server:
port: 443
ssl:
key-store: classpath:xxx.com.jks #你resources下的jks文件的文件名
key-store-password: 123456 #你keystorePass.txt里面的密码
key-store-type: JKS
3.写一个config文件
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.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpsConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(createHTTPConnector());
return tomcat;
}
private Connector createHTTPConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
//http 端口 访问80端口 就引导到 443
connector.setPort(80);
connector.setRedirectPort(443);
return connector;
}
}
4.其他
我的域名 xxx.com 和 www.xxx.com 都申请了证书
最后部署的时候用的是 xxx.com的证书
但不知道 www.xxx.com的证书有什么用 以及能不能正常部署,暂时不管了