秒懂HTTPS接口(實現篇)


				版權聲明:本文為博主原創文章,未經博主允許不得轉載。					https://blog.csdn.net/zuozewei/article/details/84727095				</div>
							            <div id="content_views" class="markdown_views prism-dracula">
						<!-- flowchart 箭頭圖標 勿刪 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p></p><div class="toc"><h3><a name="t0"></a>文章目錄</h3><ul><ul><li><a href="#HTTPS_1" rel="nofollow" target="_self">HTTPS接口實現</a></li><ul><li><a href="#Spring_Boot_38" rel="nofollow" target="_self">新建Spring Boot項目</a></li><li><a href="#Entity_68" rel="nofollow" target="_self">編寫Entity</a></li><li><a href="#_96" rel="nofollow" target="_self">統一異常處理</a></li><li><a href="#RESTful_API_216" rel="nofollow" target="_self">創建RESTful API</a></li><li><a href="#SSLHTTPS_254" rel="nofollow" target="_self">使用SSL-HTTPS</a></li><ul><li><a href="#SSL_260" rel="nofollow" target="_self">獲取SSL證書</a></li><li><a href="#HTTPS_322" rel="nofollow" target="_self">啟用HTTPS</a></li><li><a href="#HTTPHTTPS_341" rel="nofollow" target="_self">將HTTP請求重定向到HTTPS</a></li></ul><li><a href="#_385" rel="nofollow" target="_self">自定義啟動標志</a></li><li><a href="#_391" rel="nofollow" target="_self">配置日志配置文件</a></li><li><a href="#_432" rel="nofollow" target="_self">配置數據庫配置</a></li><li><a href="#_449" rel="nofollow" target="_self">啟動並測試</a></li><li><a href="#_459" rel="nofollow" target="_self">完整的項目結構</a></li></ul></ul></ul></div><p></p>

HTTPS接口實現

在上文秒懂HTTPS接口(原理篇)中我們詳細介紹了HTTPS協議原理,下面我們來實踐使用Java實現一個簡單HTTPS接口示例

項目結構:

springbootdemo
├─config 配置信息類
├─controller 控制器類
├─entity 實體類
├─enums 枚舉類
├─exception 異常類
├─handler 捕獲類
├─repository 數據訪問類 
├─util 工具類
├─SpringbootdemoApplication 項目啟動類
├──resources 資源文件目錄
│  ├─application.yml 全局配置文件
│  ├─banner.txt 項目啟動banner
│  ├─tomcat.keystore SSL證書
│  ├─logback.xml 日志配置文件

     
     
    
    
            
    
    
   
   
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

主要特點:

  • Restful風格
  • 統一異常處理
  • SQL預處理

技術選型:

  • 核心框架:Spring Boot 2.1
  • 持久層框架:JPA 2.0
  • 日志管理:Logback
  • 數據庫:MySQL 5.7
  • 插件:lombok

開發環境:

  • SUN JDK1.8
  • Maven 3.5.4

新建Spring Boot項目

這里使用的IDE是IntelliJ IDEA 2018
在這里插入圖片描述
引包,配置pom.xml

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-rest</artifactId>
		</dependency>
        <!--引入MySQL驅動包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

     
     
    
    
            
    
    
   
   
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

編寫Entity

編寫Person實體bean,用於ORM對象關系映射,映射數據庫表結構

/** * Person實體類 */

@Entity
@Data
@Table(name = "person")
public class Person {
//主鍵自增長
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer age;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

創建一個接口PersonRepository,后續的控制器直接調用該接口繼承自JpaRepository的方法,來實現和數據庫交互

/** * 繼承JpaRepository,實現與數據庫交互(JPA支持自動生成一些基本CURD SQL語句) */
public interface PersonRepository extends JpaRepository<Person,Integer> {

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

統一異常處理

自定義異常

/** * 自定義異常類 */

//RuntimeException繼承Exception,spring只對繼承RuntimeException的異常進行回滾
public class PersonException extends RuntimeException {
private Integer code;

<span class="token keyword">public</span> <span class="token function">PersonException</span><span class="token punctuation">(</span>ResultEnum resultEnum<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">super</span><span class="token punctuation">(</span>resultEnum<span class="token punctuation">.</span><span class="token function">getMsg</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">this</span><span class="token punctuation">.</span>code <span class="token operator">=</span> code<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> Integer <span class="token function">getCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">return</span> code<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setCode</span><span class="token punctuation">(</span>Integer code<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">this</span><span class="token punctuation">.</span>code <span class="token operator">=</span> code<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

捕獲異常類

@ControllerAdvice
@Slf4j
public class ExceptionHandle {
<span class="token comment">/**
 * 捕獲異常類
 * @param e
 * @return
 */</span>
<span class="token annotation punctuation">@ExceptionHandler</span><span class="token punctuation">(</span>value <span class="token operator">=</span> Exception<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span>
<span class="token annotation punctuation">@ResponseBody</span>
<span class="token keyword">public</span> Result <span class="token function">handle</span><span class="token punctuation">(</span>Exception e<span class="token punctuation">)</span><span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>e <span class="token keyword">instanceof</span> <span class="token class-name">PersonException</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        PersonException personException <span class="token operator">=</span> <span class="token punctuation">(</span>PersonException<span class="token punctuation">)</span> e<span class="token punctuation">;</span>
        <span class="token keyword">return</span> ResultUtil<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span>personException<span class="token punctuation">.</span><span class="token function">getCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>personException<span class="token punctuation">.</span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"【系統錯誤】"</span><span class="token punctuation">,</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> ResultUtil<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token string">"未知錯誤"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

封裝異常消息枚舉

/** * 封裝異常消息枚舉類 */

public enum ResultEnum {
UNKONW_ERROR(-1, "未知錯誤"),
SUCCESS(0, "成功");

<span class="token keyword">private</span> Integer code<span class="token punctuation">;</span>
<span class="token keyword">private</span> String msg<span class="token punctuation">;</span>

<span class="token function">ResultEnum</span><span class="token punctuation">(</span>Integer code<span class="token punctuation">,</span> String msg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">this</span><span class="token punctuation">.</span>code <span class="token operator">=</span> code<span class="token punctuation">;</span>
	<span class="token keyword">this</span><span class="token punctuation">.</span>msg <span class="token operator">=</span> msg<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> Integer <span class="token function">getCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">return</span> code<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> String <span class="token function">getMsg</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">return</span> msg<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

封裝異常對象實體

/** * 封裝異常對象(Http請求返回的最外層對象) * @param <T> */

@Data
public class Result<T> {
//錯誤碼
private Integer code;
//提示信息
private String msg;
private T date;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

異常工具類

/** * 異常工具類 */
public class ResultUtil {
	public static Result sucess(Object obj) {
		Result result = new Result();
		result.setCode(0);
		result.setMsg("sucess");
		result.setDate(obj);
		return result;
	}
<span class="token keyword">public</span> <span class="token keyword">static</span> Result <span class="token function">sucess</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	Result result <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Result</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	result<span class="token punctuation">.</span><span class="token function">setCode</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	result<span class="token punctuation">.</span><span class="token function">setMsg</span><span class="token punctuation">(</span><span class="token string">"sucess"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">return</span> result<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">static</span> Result <span class="token function">error</span><span class="token punctuation">(</span>Integer code<span class="token punctuation">,</span> String message<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	Result result <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Result</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	result<span class="token punctuation">.</span><span class="token function">setCode</span><span class="token punctuation">(</span>code<span class="token punctuation">)</span><span class="token punctuation">;</span>
	result<span class="token punctuation">.</span><span class="token function">setMsg</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">return</span> result<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 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

創建RESTful API

風格設計

請求類型 請求路徑 功能
Get /person 獲取人員列表
Post /person 創建一個人員

創建Controller

/** * 控制器,處理Http/https請求(RESTful API) */

@RestController
public class PersonController {
@Autowired
PersonRepository personRepository;

<span class="token comment">/**
 * 查詢所有人員列表(Get方式)
 * @return
 */</span>

<span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span>value <span class="token operator">=</span> <span class="token string">"/person"</span><span class="token punctuation">)</span>
<span class="token keyword">private</span> List<span class="token generics function"><span class="token punctuation">&lt;</span>Person<span class="token punctuation">&gt;</span></span> <span class="token function">personlist</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">return</span> personRepository<span class="token punctuation">.</span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/**
 * 添加人員 (Post方式)
 * @param person
 * @return
 */</span>
<span class="token annotation punctuation">@PostMapping</span><span class="token punctuation">(</span>value <span class="token operator">=</span> <span class="token string">"/person"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> Result <span class="token function">personAdd</span><span class="token punctuation">(</span>HttpServletRequest request<span class="token punctuation">,</span><span class="token annotation punctuation">@RequestBody</span> Person person<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">return</span> ResultUtil<span class="token punctuation">.</span><span class="token function">sucess</span><span class="token punctuation">(</span>personRepository<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span>person<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 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

使用SSL-HTTPS

Spring Boot中使用HTTPS步驟:

  1. 要有一個SSL證書,證書怎么獲取呢?買(通過證書授權機構購買)或者自己生成(通過keytool生成)
  2. 啟用HTTPS
  3. 將HTTP重定向到HTTPS(可選)

獲取SSL證書

有兩種方式可以獲取到SSL證書:

  • 自己通過keytool生成;
  • 通過證書授權機構購買;

這里作為演示,采用keytool生成,實際項目中大部分采用的都是購買的方式。
那么怎么使用keytool生成呢?
Keytool是Java提供的證書生成工具,如果配置了JAVA_HOME的,直接就可以在控制台進行生成了,這里演示使用的是Mac的終端窗口

192:~ apple$ keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore
輸入密鑰庫口令:  
再次輸入新口令: 
您的名字與姓氏是什么?
  [Unknown]:  zuozewei
您的組織單位名稱是什么?
  [Unknown]:  7DGroup
您的組織名稱是什么?
  [Unknown]:  7D
您所在的城市或區域名稱是什么?
  [Unknown]:  Beijing
您所在的省/市/自治區名稱是什么?
  [Unknown]:  Beijing
該單位的雙字母國家/地區代碼是什么?
  [Unknown]:  CN
CN=zuozewei, OU=7DGroup, O=7D, L=Beijing, ST=Beijing, C=CN是否正確?
  []:  y

輸入 <tomcat> 的密鑰口令
(如果和密鑰庫口令相同, 按回車):
再次輸入新口令:

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

查看生成的SSL證書信息

apple$ keytool -list -keystore tomcat.keystore 
輸入密鑰庫口令:  
密鑰庫類型: jks
密鑰庫提供方: SUN

您的密鑰庫包含 1 個條目

tomcat, 2018-11-29, PrivateKeyEntry,
證書指紋 (SHA1): 2B:C5:FB:77:2C:5E:DC:5B:C5:E9:9F:06:27:7F:2E:A4:E4:9E:DF:8C

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

這里解釋下命令的各個參數的含義:
-genkey :生成key;
-alias :key的別名;
-dname:指定證書擁有者信息
-storetype :密鑰庫的類型為JCEKS。常用的有JKS(默認),JCEKS(推薦),PKCS12,BKS,UBER。每個密鑰庫只可以是其中一種類型。
-keyalg :DSA或RSA算法(當使用-genkeypair參數),DES或DESede或AES算法(當使用-genseckey參數);
-keysize :密鑰的長度為512至1024之間(64的倍數)
-keystore :證書庫的名稱
-validity : 指定創建的證書有效期多少天

dname的值詳解:
CN(Common Name名字與姓氏)
OU(Organization Unit組織單位名稱)
O(Organization組織名稱)
L(Locality城市或區域名稱)
ST(State州或省份名稱)
C(Country國家名稱)

這時候在當前目錄下就會看到一個文件tomcat.keystore,到這里SSL證書就有了。

啟用HTTPS

默認情況下Spring Boot內嵌的Tomcat服務器會在8080端口啟動HTTP服務,Spring Boot允許在全局配置文件中配置HTTP或HTTPS,但是不可同時配置,如果兩個都啟動,至少有一個要以編程的方式配置,Spring Boot官方文檔建議在application配置文件中配置HTTPS,因為HTTPS比HTTP更復雜一些

application.yml中配置HTTPS,配置信息如下:

server:
  port: 443
  servlet:
    context-path: /springboot
  ssl:
    key-store: classpath:tomcat.keystore
    key-store-type: jks
    key-alias: tomcat
    key-store-password: zuozewei
    key-store-provider: SUN
    key-password: zuozewei
    enabled: true

     
     
    
    
            
    
    
   
   
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注意:請將在上一步生成的證書放到src/main/resources目錄下。

將HTTP請求重定向到HTTPS

由於不能同時在application.l中同時配置兩個connector,所以要以編程的方式配置HTTP Connector,然后重定向到HTTPS Connector

編寫TomcatHttp配置類

@Configuration
public class TomcatHttpConfig {
<span class="token comment">/**
 * 配置內置的Servlet容器工廠為Tomcat
 * @return
 */</span>
<span class="token annotation punctuation">@Bean</span>
<span class="token keyword">public</span> ServletWebServerFactory <span class="token function">servletContainer</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	TomcatServletWebServerFactory tomcat <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TomcatServletWebServerFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
		<span class="token annotation punctuation">@Override</span>
		<span class="token keyword">protected</span> <span class="token keyword">void</span> <span class="token function">postProcessContext</span><span class="token punctuation">(</span>Context context<span class="token punctuation">)</span> <span class="token punctuation">{</span>
			SecurityConstraint securityConstraint <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SecurityConstraint</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			securityConstraint<span class="token punctuation">.</span><span class="token function">setUserConstraint</span><span class="token punctuation">(</span><span class="token string">"CONFIDENTIAL"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			SecurityCollection collection <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SecurityCollection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			collection<span class="token punctuation">.</span><span class="token function">addPattern</span><span class="token punctuation">(</span><span class="token string">"/*"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			securityConstraint<span class="token punctuation">.</span><span class="token function">addCollection</span><span class="token punctuation">(</span>collection<span class="token punctuation">)</span><span class="token punctuation">;</span>
			context<span class="token punctuation">.</span><span class="token function">addConstraint</span><span class="token punctuation">(</span>securityConstraint<span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token punctuation">}</span>
	<span class="token punctuation">}</span><span class="token punctuation">;</span>
	<span class="token comment">//添加配置信息,主要是Http的配置信息</span>
	tomcat<span class="token punctuation">.</span><span class="token function">addAdditionalTomcatConnectors</span><span class="token punctuation">(</span><span class="token function">redirectConnector</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">return</span> tomcat<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/**
 * 配置一個Http連接信息
 * @return
 */</span>
<span class="token keyword">private</span> Connector <span class="token function">redirectConnector</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	Connector connector <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Connector</span><span class="token punctuation">(</span><span class="token string">"org.apache.coyote.http11.Http11NioProtocol"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	connector<span class="token punctuation">.</span><span class="token function">setScheme</span><span class="token punctuation">(</span><span class="token string">"http"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	connector<span class="token punctuation">.</span><span class="token function">setPort</span><span class="token punctuation">(</span><span class="token number">8088</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	connector<span class="token punctuation">.</span><span class="token function">setSecure</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	connector<span class="token punctuation">.</span><span class="token function">setRedirectPort</span><span class="token punctuation">(</span><span class="token number">443</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">return</span> connector<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 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

自定義啟動標志

只需要在src/main/resources路徑下新建一個banner.txt文件,banner.txt中填寫好需要打印的字符串內容即可。
一般情況下,我們會借助第三方工具幫忙轉化內容,如:
網站:http://www.network-science.de/ascii/ 將文字轉化成字符串,
網站:http://www.degraeve.com/img2txt.php 可以將圖片轉化成字符串。

配置日志配置文件

只需要在src/main/resources路徑下新建一個logback.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n"/>
    <property name="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="CRAWLER_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/event.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/event.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    <logger name="com.business.intelligence.util.CrawlerLogger" level="INFO" additivity="false">
        <appender-ref ref="CRAWLER_LOG"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

     
     
    
    
            
    
    
   
   
           
  • 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

配置數據庫配置

手動先創建db_person數據庫

spring:
  profiles:
    active: a
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    #手動創建db_person數據庫
    url: jdbc:mysql://39.105.21.2:3306/db_person?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: zuozewei
    password: zuozewei
jpa:
  hibernate:
    ddl-auto: update
  show-sql: true

     
     
    
    
            
    
    
   
   
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

啟動並測試

啟動項目
在這里插入圖片描述
通過瀏覽器輸入:http://127.0.0.1:8088/springboot/person
在這里插入圖片描述
我們可以看到瀏覽器自動重定向到 https://127.0.0.1/springboot/person

點擊瀏覽器上方的證書,我們可以看到使用的SSL證書信息
在這里插入圖片描述

完整的項目結構

在這里插入圖片描述

秒懂HTTPS接口系列源碼:
https://github.com/zuozewei/Java-API-Test-Examples

相關系列:
秒懂HTTPS接口(原理篇)
秒懂HTTPS接口(接口測試篇)
秒懂HTTPS接口(JMeter壓測篇)

        </div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet">
            </div>
</article>
posted @ 2019-03-25 23:22  嗯哼~  閱讀( 1307)  評論( 0編輯  收藏


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM