- 本文以Spring Boot2.x为例,文末会介绍Spring Boot1.x的相关方法
- 写在题首:现在网上大多关于这点的教程是以Spring Boot1.x为例,所以作者在写代码的过程中发现其中用到的类
EmbeddedServletContainerFactory
找不到,几经查找发现此类在Spring Boot2.x 中已经废弃,改为TomcatServletWebServerFactory
在默认情况下我们创建一个 Java Spring Boot 的后台工程,并配置了端口(此处以port:8085为例)之后,便可以制作一个接口共外部访问,例如:
@RestController
public class TestController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String testIndex() {
return "这是hanxun商城后台的测试接口!";
}
}
此时我们就可以在本机浏览器中通过
http://localhost:8075/hello
的方式来调用该接口,当然这种情况下默认的接口类型是Http
的。这时候如果我们希望将这种接口改为Https
类型的,可做如下配置:。
证书生成
使用SSL需要我们先生成一个证书,这个证书我们可以自己生成,也可以从SSL证书授权中心获得,自己生成的不被客户端认可,从授权中心获得的可以被客户端认可,提供SSL授权证书的服务商有很多,小伙伴们有兴趣可以自行查找,我这里以自己生成的证书为例。 生成方式也很简单,直接使用java自带的命令keytool来生成,生成命令如下:
`keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650`
此处涉及到的几个参数含义如下:
1. -storetype 指定密钥仓库类型
2. -keyalg 生证书的算法名称,RSA是一种非对称加密算法
3. -keysize 证书大小
4. -keystore 生成的证书文件的存储路径
5. -validity 证书的有效期
在此命令执行过程中会出现以下内容:
输入密钥库口令:
密钥库口令太短 - 至少必须为 6 个字符
输入密钥库口令:
再次输入新口令:
此处我输入的口令(即证书的密码):1234567890
这个在代码中会用到,需要牢记。
随后出现:
您的名字与姓氏是什么?
[Unknown]:
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的省/市/自治区名称是什么?
[Unknown]:
该单位的双字母国家/地区代码是什么?
[Unknown]:
CN=Unknown, OU=hanxun, O=hanxun, L=Unknown, ST=Unknown, C=Unknown是否正确?
[否]: y
以上内容可填写也可不填,不填的话直接按下 回车 键 即可,在最后一步中想输入 y
确定。至此,证书生成的工作完成。
工程文件代码配置
在执行完上面一行命令后,在你的系统的当前用户目录下会生成一个keystore.p12文件(如果你修改了证书文件的名称那就是你 修改的名字.p12
),将这个文件拷贝到我们项目的根目录下,然后修改application.properties
文件或是 application.yml
文件,添加HTTPS支持。在上面提到的问价中添加如下代码:
server:
ssl: key-store: keystore.p12
key-store-password: 1234567890
key-store-type: PKCS12
key-alias: tomcat
此处,keystore.p12
为上文中生成的证书文件,并以此来指定签名文件, 1234567890
为命令中输入的证书口令,key-store-type
为指定秘钥仓库的类型,key-alias
是指定别名。
通过以上的配置之后我们便可以在浏览器中 通过HTTPS
的方式来访问接口了,访问结果如下所示如下:
图中的端口8075
为本文开始处设置的端口。
配置HTTP自动转向HTTPS
进行到这里通过Https
来访问没有问题了,但是不可避免的。有些用户并不知道这是个 Https
接口,还是会使用Http
来访问,这是浏览器中就会报错,如下图所示:
这个时候我们需要添加HTTP自动转向HTTPS的功能,当用户使用HTTP来进行访问的时候自动转为HTTPS的方式。这个配置很简单,在入口类中添加相应的转向Bean就行了,如下:
/**
*@Despription HTTP自动转向HTTPS 设置1
*@Params
*@return
*@Created Charles.Zhang
*@Time 2018/8/29
*@Modify
*/
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8075);
return connector;
}
/**
*@Despription HTTP自动转向HTTPS 设置2
*@Params
*@return
*@Created Charles.Zhang
*@Time 2018/8/29
*@Modify
*/
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
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(connector());
return tomcat;
}
这个时候当我们访问http://localhost:8080的时候系统会自动重定向到https://localhost:8075这个地址上。
Spring boot1.x
下的配置 EmbeddedServletContainerFactory
这里用到的类是:TomcatServletWebServerFactory
,但是在 Spring boot1.x
下 使用的是 EmbeddedServletContainerFactory
,下面将在 Spring boot1.x
下的用法展示如下:
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8033);
return connector;
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomca t= 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(connector());
return tomcat;
}