秒懂HTTPS接口實現篇)

      網友投稿 1060 2022-05-30

      前言

      新建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 日志配置文件

      秒懂HTTPS接口(實現篇)

      主要特點:

      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

      org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-data-rest mysql mysql-connector-java org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test

      編寫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 */ @Data public class Result { //錯誤碼 private Integer code; //提示信息 private String msg; private T date; }

      異常工具類

      /** * 異常工具類 */ 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 personlist() { return personRepository.findAll(); } /** * 添加人員 (Post方式) * @param person * @return */ @PostMapping(value = "/person") public Result personAdd(HttpServletRequest request,@RequestBody Person person) { return ResultUtil.sucess(personRepository.save(person)); } }

      使用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配置文件

      ${LOG_PATH}/${LOG_FILE} ${LOG_PATH}/${LOG_FILE}.%d{yyyy-MM-dd} ${FILE_LOG_PATTERN} ${FILE_LOG_PATTERN} ${LOG_PATH}/event.log ${LOG_PATH}/event.%d{yyyy-MM-dd}.log 30 %msg%n

      配置數據庫配置

      手動先創建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小時內刪除侵權內容。

      上一篇:編譯器與解釋器的區別和工作原理
      下一篇:華為極客周活動-昇騰萬里--模型王者挑戰賽VQVAE調通過程 下
      相關文章
      亚洲äv永久无码精品天堂久久| 亚洲小说图区综合在线| 亚洲aⅴ无码专区在线观看春色| 久久精品国产亚洲av麻豆图片| 精品亚洲成AV人在线观看| 亚洲av无码一区二区三区网站| 亚洲精品午夜无码电影网| 亚洲日韩国产精品第一页一区 | 亚洲午夜精品久久久久久浪潮| 国产成人亚洲精品蜜芽影院| 亚洲aⅴ无码专区在线观看春色 | 亚洲国产精品久久久久婷婷软件 | 亚洲国产精品无码久久久秋霞1| 亚洲综合一区无码精品| 亚洲午夜精品一区二区麻豆| 亚洲国产系列一区二区三区 | 国产亚洲成AV人片在线观黄桃 | 亚洲人成网站999久久久综合| 亚洲日韩一区二区一无码| 亚洲狠狠婷婷综合久久蜜芽| 亚洲AV永久无码精品一福利| 在线亚洲v日韩v| 亚洲中文字幕视频国产| 久久精品亚洲乱码伦伦中文| 国产美女亚洲精品久久久综合| 亚洲男同帅GAY片在线观看| 亚洲av午夜成人片精品网站 | 久久亚洲精品中文字幕| 亚洲福利电影一区二区?| 亚洲三级在线视频| 亚洲中文字幕久久精品无码VA| 亚洲成熟丰满熟妇高潮XXXXX| yy6080亚洲一级理论| 国产亚洲精品AA片在线观看不加载 | 亚洲第一网站免费视频| 亚洲精品美女网站| 亚洲欧美在线x视频| 久久亚洲AV无码西西人体| 久久久亚洲精品无码| 亚洲字幕在线观看| 亚洲人成色777777老人头|