1首先需要证书 我是自己生成的ssl证书,当然这个证书是不被客户端认可的 打开cmd,输入生成证书的命令
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
关于这几个参数的解释如下:
-storetype 指定密钥仓库类型
-keyalg 生证书的算法名称,RSA是一种非对称加密算法
-keysize 证书大小
-keystore 生成的证书文件的存储路径
-validity 证书的有效期
命令不存在则去jdk bin目录下执行 输入密码以及信息 完成之后,系统的当前用户目录下会生成一个keystore.p12文件,当然你在生成证书的时候可以改变证书的名称,那么相应的系统用户目录下就会生成相应的文件,将keystore.p12文件拷贝到我们项目的根路径下
2修改application.properties文件,添加HTTPS支持
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias:tomcat
注:这里的key-store-password就是我们生成ssl证书时设置的密钥库的口令
此时,我们的工程就支持了https请求
3http请求转换成https请求 我们已经习惯用http请求访问,此时我们的项目支持的是https请求,为了方便我们可以将访问时的http请求转换成https请求 在main方法中添加注解bean,代码如下
@RestController
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@RequestMapping(value = "/",produces = "text/plain;charset=UTF-8")
String index(){
return "Hello Spring Boot!";
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
@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(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
//Connector监听的http的端口号
connector.setPort(8080);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(8081);
return connector;
}
}
注:我们知道spring boot内置的tomcat启动时的默认的端口号时8080,我们现在需要将http请求转换成https请求,所以一定要区分端口号,我们在代码中将http的端口号设置为8080,在application.properties添加https的端口号
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias:tomcat
server.port=8081
启动项目,我们访问https://localhost:8081/,(同时还是需要设置浏览器的安全认证的)页面可以正常显示说明项目是支持https请求的
4同时支持http和https请求 如果我们想要项目同时支持http和https请求,就是说我们用http请求时不再转换成https请求,同时还支持https请求,很简单,我们只需要将代码中的connector.setSecure(false)中的false改成true就可以了,代码如下:
@RestController
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@RequestMapping(value = "/",produces = "text/plain;charset=UTF-8")
String index(){
return "Hello Spring Boot!";
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
@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(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
//Connector监听的http的端口号
connector.setPort(8080);
connector.setSecure(true);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(8081);
return connector;
}
}
启动项目,我们访问https://localhost:8081/,页面可以正常显示说明项目是支持https请求的
访问http://localhost:8080/,我们可以看到页面的url并没有转换成https请求,页面也可以正常显示,说明我们的需求解决了,可以同时支持http和https请求。 如有问题,欢迎指正!!!!
参考博客 作者:嗨_等风来 链接:https://www.jianshu.com/p/71cd01fa8438 来源:简书