排雷!springboot同时接受https和http方法与坑

感谢简书嗨_等风来文章予以参考,

项目需要支持http和https两种协议,网上百度一波,大家讲的都差不多,但在我使用中也走了一点点弯路,我总结一下这次的使用以及我遇到的问题,希望可以帮助和我一样的萌新

一:依赖方面,初始的springboot就可以,我的是2.2.2-release版

二:本地创建证书调试

ps:首先进入你的Java\bin目录下,然后执行如下命令

keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore 
D:\keystore.p12 -validity 3650

这其中的字段含义如下:

1.-storetype 指定密钥仓库类型
2.-keyalg 生证书的算法名称,RSA是一种非对称加密算法
3.-keysize 证书大小
4.-keystore 生成的证书文件的存储路径
5.-validity 证书的有效期

然后就会出现如下,随便填写就好:

然后在你写的路径下就会有一个keystore.p12文件,复制到项目中去,路径随便

PS: 这里切记切记,如果要部署的话,打完包的路径和你本地的路径是不一样的,本地测试可以,部署上去就不行了,这里建议放在项目根路径下的文件夹里,可以用assembly配置打包路径,或者使用user.dir来获取路径。

三、撸代码

具体看注释就可以了,开头老哥中的写法是以前版本的。这个是2.x后的写法。有位老哥解读了一下变更的源码我找不到了,下回看见附上链接吧

package com.ehl.restful;

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.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SSLConfig {
	@Value("${http.port}")
	private Integer httpPort;

	@Value("${server.port}")
	private Integer httpsPort;

	@Bean
	public TomcatServletWebServerFactory servletContainer() { //springboot2 新变化

		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(initiateHttpConnector());
		return tomcat;
	}

	private Connector initiateHttpConnector() {
		Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
		connector.setScheme("http");
		connector.setPort(httpPort);//http端口
		connector.setSecure(true);//这个,true同时支持http和https
		connector.setRedirectPort(httpsPort);// https端口
		return connector;
	}

}

然后是配置文件的

#https port
server.port=8081
#http port
http.port=8888
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias:tomcat

一开始还纠结怎么能配两个端口呢,才发现http.port是自定的,只是为了在config中注入进入而已,名称随便怎么写,端口还是只有server.port来配置。

四、没了,启动就完事了。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值