目录
前言
Spring Boot默认内嵌 Tomcat 为 servlet 容器,同时也支持Undertow和Jetty。
本文示例代码:https://github.com/lizitaowork/SpringBoot-demo.git
Tomcat
一、配置Tomcat
1、普通servlet配置:都是以 server.* 形式在application.properties中配置:
#配置程序端口,默认为8080
server.port=8888
#配置访问路径,默认为/
server.servlet.context-path=/tomcat
2、Tomcat配置:都是以 server.tomcat.* 形式在application.properties中配置:
#配置tomcat编码,默认为UTF-8
server.tomcat.uri-encoding=UTF-8
更多Tomcat的属性配置,各位博友可以在spring-boot-autoconfigure包下的 ServerProperties.java中查看,在此不再赘述。
二、替换Tomcat为Jetty
先来看一下 spring-boot-starter-web 的pom.xml中的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.3.RELEASE</version>
<name>Spring Boot Web Starter</name>
<description>Starter for building web, including RESTful, applications using Spring
MVC. Uses Tomcat as the default embedded container</description>
<url>https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-web</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>https://spring.io</url>
</organization>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<developers>
<developer>
<name>Pivotal</name>
<email>info@pivotal.io</email>
<organization>Pivotal Software, Inc.</organization>
<organizationUrl>http://www.spring.io</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/spring-projects/spring-boot.git/spring-boot-starters/spring-boot-starter-web</connection>
<developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-boot.git/spring-boot-starters/spring-boot-starter-web</developerConnection>
<url>http://github.com/spring-projects/spring-boot/spring-boot-starters/spring-boot-starter-web</url>
</scm>
<issueManagement>
<system>Github</system>
<url>https://github.com/spring-projects/spring-boot/issues</url>
</issueManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.0.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- 默认serlet容器为tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.0.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.10.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.7.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.7.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
发现 spring-boot-starter-tomcat 在依赖列表中,如果要使用Jetty,只需要修改 spring-boot-starter-web 的依赖即可:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
启动Spring boot,控制台效果如下:
三、替换Tomcat为Undertow
同理,修改 spring-boot-starter-web 依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
启动Spring Boot,控制台效果如下:
SSL
SSL配置也是我们在实际开发中经常遇到的场景,在Web引用中,是通过Https来实现SSL的,Https是以安全为目标的Http通道,简单来说就是安全版的Http。
一、生成证书
使用Java自带的命令keytool命令来生成,生成命令如下:
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
#参数说明如下:
# -storetype 指定密钥仓库类型
# -keyalg 生证书的算法名称,RSA是一种非对称加密算法
# -keysize 证书大小
# -keystore 生成的证书文件的存储路径
# -validity 证书的有效期
输入命令,按照提示,一步步生成秘钥 :
$ keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: zitao.li
您的组织单位名称是什么?
[Unknown]: company
您的组织名称是什么?
[Unknown]: organization
您所在的城市或区域名称是什么?
[Unknown]: beijing
您所在的省/市/自治区名称是什么?
[Unknown]: beijing
该单位的双字母国家/地区代码是什么?
[Unknown]: CH
CN=zitao.li, OU=company, O=organization, L=beijing, ST=beijing, C=CH是否正确?
[否]: y
将生成的秘钥放到项目的根目录下:
二、SpringBoot配置SSL
在application.properties中配置SSL:
#tomcat端口
server.port=8888
#秘钥路径
server.ssl.key-store=keystore.p12
#密码(即生成秘钥时输入的密码)
server.ssl.key-store-password=111111
#秘钥类型
server.ssl.keyStoreType=PKCS12
#别名
server.ssl.keyAlias:ailas
运行Spring Boot,控制台详情如下:
三、http转向https
很多时候,我们在浏览器地址栏中输入的是http,但会自动转向https,例如我们访问百度的时候:
要实现此功能,我们需要配置 TomcatServletWebServerFactory (我的Spring Boot版本是2.0.3,低版本的Spring Boot应该配置TomcatEmbeddedServletContainerFactory), 并添加tomcat的connector来实现:
@Configuration
public class HttpsConfigure {
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
//confidential
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
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(8888);
return connector;
}
}
启动Spring Boot,控制台效果如下:
浏览器中访问效果: