Spring Boot中的容器配置和SSL支持,springssl
Spring Boot中的容器配置和SSL支持,springssl
servlet容器配置
Spring Boot快速的原因除了自动配置外,另一个就是将web常用的容器也集成进来并做自动配置,让使用它的人能更快速的搭建web项目,快速的实现自己的业务目的。什么是容器?在这里就是支持java程序运行的程序。本节内容只详细展开Tomcat配置,不过,本节内容对后面提到的Jetty、Undertow都是通用。
1-配置文件配置Tomcat
之前我们在配置章节介绍了如何查看配置的定义,这里,我们同样能在org.springframework.boot.autoconfigure.web中找到ServerProperties,通用的servler通用的配置就是在这里定义的,以“server”作为前缀,而作为默认内嵌容器的Tomcat的配置是以server.tomcat作为前缀的。以下为举例:
// servlet 容器
server.port=9090 #监听端口,默认是8080
server.context-path= #访问路径,默认为/
- 1
- 2
- 3
// 配置tomcat
server.tomcat.uri-encoding= #tomcat编码,默认为UTF-8
server.tomcat.accesslog.directory= #访问日志,默认为logs
- 1
- 2
- 3
以上为简单说明,详细的配置可在application.properties输入server或server.tomcat来查看,idea可以很方便的提示有哪些功能,如图:
2-代码配置Tomcat
Spring Boot的自动配置有一个特性就是能够通过代码来修改配置,这样可以很方便的修改配置,而我们只需要实现Spring Boot定义的接口即可。这里,我们需要注册一个实现了EmbeddedServletContainerCustomizer的Bean。而如果直接配置指定容器,那么使用对应工厂类实现即可,对应如下:
Tomcat ---> TomcatEmbeddedServletContainerFactory
Jetty ---> JettyEmbeddedServletContainerFactory
Undertow ---> UndertowEmbeddedServletContainerFactory
- 1
- 2
- 3
公用配置
新建一个可修改的公用server配置:
package com.hjf.boot.demo.boot_ssl.config;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
public class CustomerServlet implements EmbeddedServletContainerCustomizer {
public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
configurableEmbeddedServletContainer.setPort(9090); //1
configurableEmbeddedServletContainer.setContextPath("/test"); //2
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
说明:
1:修改监听端口
2:修改访问路径,和配置文件修改是类似的。
特殊配置
增加配置类,并注册Bean
@Configuration
public class ServletConfig {
}
- 1
- 2
- 3
Tomcat配置
@Bean
public EmbeddedServletContainerFactory servletContainer(){
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.setPort(9999);
factory.setContextPath("/test");
return factory;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Jetty配置
@Bean
public EmbeddedServletContainerFactory servletContainer(){
JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
factory.setPort(9999);
factory.setContextPath("/test");
return factory;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Undertow配置
@Bean
public EmbeddedServletContainerFactory servletContainer(){
UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
factory.setPort(9999);
factory.setContextPath("/test");
return factory;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
注意:一个项目只用配置一个容器即可,不要重复注册多个。
3-替换内嵌容器
Spring Boot默认是用Tomcat作为Servlet的容器,我们上面可以配置另外另个容器,那么这里就需要排除掉Tomcat为对应容器:
使用Jetty
在pom.xml中修改如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starte-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
使用Undertow
在pom.xml中修改如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starte-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
使用SSL
什么是SSL?百度百科这样解释的,SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
使用SSL通常就两步,一是,生成有效的证书,让你的http链接有据可循,这个证书是可以自签名的,也可以是从SSL证书授权中心获得的,一般大的网站都是授权了,比如,百度、京东等,也有没授权的,例如:12306,但是都不影响使用;二是,在web容器里配置开启SSL,让配置的ssl生效。
生成证书
1、先找到你使用的java JDK,在bin文件夹中找到工具keytool,如何你设置了java的环境变量的话,直接在命令行执行命令如下(Windows和Linux都是一样的):
keytool -genkey -alias mickjoust -keyalg RSA //1
说明:
1:如果不指定算法格式的话,会使用老的加密格式,高版本的容器,都会报安全格式不支持的错误。
这时生成了一个.keystore,就是证书文件了。
配置SSL
在Spring Boot中配置SSL非常简单,同样在application.properties下配置:
server.port=8443 //1
#server.session.timeout=
#server.context-path=
server.tomcat.uri-encoding=UTF-8
#server.tomcat.compression= #新版已经没有了
server.ssl.key-store=.keystore //2
server.ssl.key-store-password=123456 //3
server.ssl.key-store-type=JKS //4
server.ssl.key-alias=mickjoust //5
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
说明:
1:指定监听端口
2:ssl存储的文件名
3:证书密码
4:证书类型
5:证书别名
使用代码配置http自动跳转https
上面配置了SSL,只是支持SSL,也就是说,当你输入同样的网址带上https时,是可以访问的,但我们有时习惯了只输入网址,而浏览器默认是使用的http,这时我们希望能够自动跳转,要实现这个功能,我们需要配置容器的自动重定向功能。使用tomcat作为示例,jetty和Undertow类似,需要查看对应文档。
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.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Http2HttpsConfig {
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(){//1
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(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector(){//2
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(9090);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
说明:
1:重写上下文设置,添加路径和安全集合。
2:创建一个httpconnector以被使用。
启动成功,看到https端口了
执行localhost:9090测试
自动跳转到https了
很多同学比较疑惑,这也太麻烦了,还不如直接使用tomcat,当然,使用某种方法,也就有某种方法的代价牺牲,这里其实是通过代码的方式去配置tomcat,而平时我们都是手动操作tomcat的xml配置,这也是上面最开始说到的,如果没有一定的耐心,那么只是在完成任务,一旦遇见有一点困难的配置或任务,那么就不知道该怎么办了。其实,只要理解了原理,无论用什么配置,都是达到目的的手段而已。
查看评论
评论暂时关闭