由于SpringBoot项目默认是使用http发送的请求,不支持HTTPS请求,而发送HTTPS请求需要需要使用数字证书,虽然各大服务云商都有,但是那个是收费使用的,生产环境如果需要,肯定需要在正规地方购买,当然我们本地测试就不需要那么购买了,可以使用java自带的生成数字证书。
进入jdk的安装目录,bin文件夹下,打开命令窗口输入以下命令生成数字证书:
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:/javasign.p12 -validity 365 # 或者 keytool -importkeystore -srckeystore D:/javasign.p12 -destkeystore D:/javasign.p12 -deststoretype pkcs12 复制代码
命令含义如下:
生成以下数字证书。
接下来我们需要在项目中引入 https。
将上面生成的 javaboy.p12 拷贝到 Spring Boot 项目的 resources 目录下。然后在 application.yml中添加如下配置:
server: port: 8090 ssl: key-alias: classpath:javasign.p12 key-store: tomcathttps key-store-password: 123456 复制代码
参数说明
在浏览器输入‘ https://localhost:8080/app/index ’ ,会出现以下页面,点击高级--继续
最终可以使用HTTPS访问
但是当我们使用HTTP访问的时候,就会出现问题。
解决办法,添加配置文件。
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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatConfig { @Bean TomcatServletWebServerFactory tomcatServletWebServerFactory() { TomcatServletWebServerFactory factory = 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); } }; factory.addAdditionalTomcatConnectors(createTomcatConnector()); return factory; } @Bean private Connector createTomcatConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8081); connector.setSecure(false); connector.setRedirectPort(8080); return connector; } } 复制代码
通过这段配置,访问 http://localhost:8081/app/index
的时候系统会自动重定向到 https://localhost:8080/app/index
这个地址上。