秒懂HTTPS接口(實現篇)
前言
新建Spring Boot項目
編寫Entity
統一異常處理
創建RESTful API
使用SSL-HTTPS
獲取SSL證書
啟用HTTPS
將HTTP請求重定向到HTTPS
前言
新建Spring Boot項目
編寫Entity
統一異常處理
創建RESTful API
使用SSL-HTTPS
獲取SSL證書
啟用HTTPS
將HTTP請求重定向到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 日志配置文件
主要特點:
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
編寫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; }
創建一個接口PersonRepository,后續的控制器直接調用該接口繼承自JpaRepository的方法,來實現和數據庫交互
/** * 繼承JpaRepository,實現與數據庫交互(JPA支持自動生成一些基本CURD SQL語句) */ public interface PersonRepository extends JpaRepository
統一異常處理
自定義異常
/** * 自定義異常類 */ //RuntimeException繼承Exception,spring只對繼承RuntimeException的異常進行回滾 public class PersonException extends RuntimeException { private Integer code; public PersonException(ResultEnum resultEnum) { super(resultEnum.getMsg()); this.code = code; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } }
捕獲異常類
@ControllerAdvice @Slf4j public class ExceptionHandle { /** * 捕獲異常類 * @param e * @return */ @ExceptionHandler(value = Exception.class) @ResponseBody public Result handle(Exception e){ if (e instanceof PersonException){ PersonException personException = (PersonException) e; return ResultUtil.error(personException.getCode(),personException.getMessage()); } log.error("【系統錯誤】",e); return ResultUtil.error(-1,"未知錯誤"); } }
封裝異常消息枚舉
/** * 封裝異常消息枚舉類 */ public enum ResultEnum { UNKONW_ERROR(-1, "未知錯誤"), SUCCESS(0, "成功"); private Integer code; private String msg; ResultEnum(Integer code, String msg) { this.code = code; this.msg = msg; } public Integer getCode() { return code; } public String getMsg() { return msg; } }
封裝異常對象實體
/** * 封裝異常對象(Http請求返回的最外層對象) * @param
異常工具類
/** * 異常工具類 */ public class ResultUtil { public static Result sucess(Object obj) { Result result = new Result(); result.setCode(0); result.setMsg("sucess"); result.setDate(obj); return result; } public static Result sucess() { Result result = new Result(); result.setCode(0); result.setMsg("sucess"); return result; } public static Result error(Integer code, String message) { Result result = new Result(); result.setCode(code); result.setMsg(message); return result; } }
創建RESTful API
風格設計
創建Controller
/** * 控制器,處理Http/https請求(RESTful API) */ @RestController public class PersonController { @Autowired PersonRepository personRepository; /** * 查詢所有人員列表(Get方式) * @return */ @GetMapping(value = "/person") private List
使用SSL-HTTPS
Spring Boot中使用HTTPS步驟:
要有一個SSL證書,證書怎么獲取呢?買(通過證書授權機構購買)或者自己生成(通過keytool生成)
啟用HTTPS
將HTTP重定向到HTTPS(可選)
有兩種方式可以獲取到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 輸入
查看生成的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
這里解釋下命令的各個參數的含義:
-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證書就有了。
默認情況下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
注意:請將在上一步生成的證書放到src/main/resources目錄下。
由于不能同時在application.l中同時配置兩個connector,所以要以編程的方式配置HTTP Connector,然后重定向到HTTPS Connector
編寫TomcatHttp配置類
@Configuration public class TomcatHttpConfig { /** * 配置內置的Servlet容器工廠為Tomcat * @return */ @Bean public ServletWebServerFactory servletContainer() { 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); } }; //添加配置信息,主要是Http的配置信息 tomcat.addAdditionalTomcatConnectors(redirectConnector()); return tomcat; } /** * 配置一個Http連接信息 * @return */ private Connector redirectConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8088); connector.setSecure(false); connector.setRedirectPort(443); return connector; } }
自定義啟動標志
只需要在src/main/resources路徑下新建一個banner.txt文件,banner.txt中填寫好需要打印的字符串內容即可。
一般情況下,我們會借助第三方工具幫忙轉化內容,如:
網站:http://www.network-science.de/ascii/ 將文字轉化成字符串,
網站:http://www.degraeve.com/img2txt.php 可以將圖片轉化成字符串。
配置日志配置文件
只需要在src/main/resources路徑下新建一個logback.xml配置文件
配置數據庫配置
手動先創建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
啟動并測試
啟動項目
通過瀏覽器輸入:http://127.0.0.1:8088/springboot/person
我們可以看到瀏覽器自動重定向到 https://127.0.0.1/springboot/person
點擊瀏覽器上方的證書,我們可以看到使用的SSL證書信息
完整的項目結構
秒懂HTTPS接口系列源碼:
https://github.com/zuozewei/blog-example/tree/master/Java-api-test/10-https/springboot-https-demo
相關系列:
秒懂HTTPS接口(原理篇)
秒懂HTTPS接口(接口測試篇)
秒懂HTTPS接口(JMeter壓測篇)
HTTP https Java Spring Boot 自動化測試
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。