Spring Boot學習(8):Spring Boot Tomcat配置

目錄

前言

Tomcat

一、配置Tomcat

二、替換Tomcat爲Jetty

三、替換Tomcat爲Undertow

SSL

一、生成證書

二、SpringBoot配置SSL

三、http轉向https

示例代碼下載地址


前言

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>[email protected]</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://[email protected]/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,控制檯效果如下:

瀏覽器中訪問效果: 

示例代碼下載地址

https://github.com/lizitaowork/SpringBoot-demo.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章