欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

零基礎全面解析SpringBoot配置文件(結(jié)合驗證碼案例)

 更新時間:2025年09月16日 15:59:25   作者:薯條不要番茄醬  
文章介紹配置文件的作用及SpringBoot中properties和yml格式的使用,比較其優(yōu)缺點,并演示基于Hutool的驗證碼生成與校驗實現(xiàn),本文結(jié)合驗證碼案例給大家詳細講解,感興趣的朋友跟隨小編一起看看吧

1. 配置文件作用

計算機上有數(shù)以千計的配置文件, 我們使用的絕大多數(shù)軟件, 比如瀏覽器, 微信, Idea, 甚至電腦, 手機, 都離不開配置文件. 我們可能永遠不會直接與其中的大部分文件打交道,但它們確實以不同的形式散落在我們的計算機上, 比如 C:\Users, C:\Windows文件夾, 以及各種 *.config, *.xml 文件

配置文件主要是為了解決硬編碼帶來的問題, 把可能會發(fā)生改變的信息, 放在一個集中的地方, 當我們啟動某個程序時, 應用程序從配置文件中讀取數(shù)據(jù), 并加載運行.

硬編碼是將數(shù)據(jù)直接嵌入到程序或其他可執(zhí)行對象的源代碼中, 也就是我們常說的"代碼寫死".

使用配置文件, 可以使程序完成用戶和應用程序的交互, 或者應用程序與其他應用程序的交互。

SpringBoot配置文件

SpringBoot 支持并定義了配置文件的格式, 也在另一個層面達到了規(guī)范其他框架集成到SpringBoot的目的.
很多項目或者框架的配置信息也放在配置文件中, 比如:
• 項目的啟動端口: SpringBoot內(nèi)置了Tomcat服務器, 默認端口號是8080。

• 數(shù)據(jù)庫的連接信息(包含用戶名和密碼的設置): 對JDBC進行了更深層次的封裝.讓用戶通過簡單幾行代碼就可完成數(shù)據(jù)庫的訪問。

• 第三方系統(tǒng)的調(diào)用密鑰等信息。

• 用于發(fā)現(xiàn)和定位問題的普通日志和異常日志等。

2. 配置文件的常規(guī)操作

修改 application.properties 文件

server.port=9090

啟動程序,觀察日志:

顯示Tomcat啟動端口號為9090 。

3. 配置文件的格式

Spring Boot 配置文件有以下三種:

Ⅰapplication.properties
Ⅱ application.yml
Ⅲ application.yaml

yml 為 yaml 的簡寫, 實際開發(fā)中出現(xiàn)頻率最高. yaml 和yml 的使用方式一樣, 文章中只介紹 yml 文件的使用。

當應用程序啟動時, Spring Boot會自動從 classpath 路徑找到并加載
application.properties 和 application.yaml 或者 application.yml 文件。

如上圖所示 .properties 和 .yml 可以并存在于一個項目中 ,
當 .properties 和 .yml 并存時,兩個配置都會加載. 如果配置文件內(nèi)容有沖突, 則以 .properties 為主, 也就是
.properties 優(yōu)先級更高. 需要注意的是雖然 .properties 可以和 .yml 共存, 但是實際開發(fā)當中, 我們通常會采取一種統(tǒng)一的配置文件格式, 這樣方便后續(xù)的維護,降低出故障的概率。

4. properties 配置文件說明

properties 配置文件是最早期的配置文件格式,也是創(chuàng)建 SpringBoot 項目 默認的配置文件。

4.1 properties 基本語法

properties 是以鍵值的形式配置的,key 和 value 之間是以"="連接的,如:

#配置項目端口號
server.port=9090
#配置數(shù)據(jù)庫連接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=handsome
spring.datasource.password=boy

想了解Spring Boot配置文件更多內(nèi)容和細節(jié): Spring Boot配置文件官網(wǎng)

4.2 讀取配置文件

如果在項目中,想要主動的讀取配置文件中的內(nèi)容,可以使用 @Value 注解來實現(xiàn)。
@Value 注解使用 " ${} " 的格式讀取, 如下代碼所示:

properties 配置如下:

server.port=9090 
mykey=aa

創(chuàng)建一個新的類 ReadymlController

@RequestMapping("/yml")
@RestController
public class ReadymlController {
    @Value("${mykey}")
    private String key;
    @RequestMapping("/readyml")
    public String readYml() {
        return "從yml中獲取配置文件: "+key;
    }
}

運行程序, 并在瀏覽器訪問 http://127.0.0.1:9090/yml/readyml
有如下結(jié)果說明獲取成功.

4.3 properties 缺點分析

properties 配置文件中會有很多的冗余的信息,比如:

想要解決這個問題,就可以使用 yml 配置文件的格式化了.

5. yml 配置文件說明

yml 全稱 Yet Another Markup Language 翻譯成中文就是 “另一種標記語言”.

5.1 yml 基本語法

yml 是樹形結(jié)構的配置?件,它的基礎語法是"key: value"
key 和 value 之間使用英文冒號加空格的方式組成,空格不可省略.

使用 yml 連接數(shù)據(jù)庫

rce: url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false username: root password: root

可以發(fā)現(xiàn)不用像 properties那樣重復去寫 spring 和 datasource.

5.2 yml 的用法

5.2.1 yml 配置不同數(shù)據(jù)類型及 null

# 字符串
string.value: hello
# 布爾值, true或false
boolean.value: true
boolean.value1: false
# 整數(shù)
int.value: 520
# 浮點數(shù)
float.value: 13.14
# Null, ~代表 null
null.value: ~
#  空字符串
empty.value: ''
# 直接后面什么都不加也可以,但是這種方式不直觀.更多的表?是使?引號
empty.value1:

5.2.1.1 yml 配置讀取

yml 讀取配置的方式和 properties 相同,使用 @Value 注解即可,實現(xiàn)代碼如下:

yml 配置:

server:
 port: 9090
str:
 value: hello

ReadymlController 文件代碼:

    @Value("${mykey}")
    private String key;
    @Value("${str.value}")
    private String string;
    @RequestMapping("/readymlstr")
    public String readYmlstr() {
        return "從yml中獲取配置文件: "+string;
    }
    @RequestMapping("/readyml")
    public String readYml() {
        return "從yml中獲取配置文件: "+key;
    }

訪問 http://127.0.0.1:9090/yml/readymlstr
運行結(jié)果:

5.2.1.2 注意事項:value 值加單雙引號

字符串默認不用加上單引號或者雙引號,如果加英文的單雙引號可以表示特殊的含義。
在 application.yml 中配置如下信息:

string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."

ReadymlController 文件代碼:

    @Value("${string.str1}")
    private String str1;
    @Value("${string.str2}")
    private String str2;
    @Value("${string.str3}")
    private String str3;
    @RequestMapping("/readyml4")
    public String readYml4() {
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        return "從yml中獲取配置文件";
    }

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果可以看出:

字符串默認不用加上單引號或者雙引號.

單引號會轉(zhuǎn)義特殊字符,使其失去特殊功能, 始終是一個普通的字符串.

雙引號不會轉(zhuǎn)義字符串里面的特殊字符, 特殊字符會表示本身的含義.

\n 本意表示的是換行, 使用單引號會轉(zhuǎn)義,就是說, \n 不再表示換行了, 而是表示一個普通的字符串. 用雙引號不會轉(zhuǎn)義, 表示 \n 表示的是它本身的含義, 就是換行.

5.2.2 配置對象

yml 中配置對象

student:
  id: 1
  name: Java
  age: 18

這個時候就不能用 @Value 來讀取配置中的對象了,此時要使用另一個注解
@ConfigurationProperties 來讀取,在 Student 文件中 :

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * 配置對象
 */
@ConfigurationProperties(prefix = "student")//從配置文件中獲取默認值.
@Component//交給spring管理
@Data
public class Student {
//    id: 1
//    name: Java
//    age: 18
    private Integer id;
    private String name;
    private Integer age;
}

調(diào)用類的實現(xiàn)如下:

@RequestMapping("/yml")
@RestController
public class ReadymlController {
    @Autowired
    private Student student;
     @RequestMapping("/readStudent")
    public String readStudent() {
        return "從yml中獲取配置文件Student: "+student;
    }
}

運行結(jié)果如下所示:

5.2.3 配置集合

配置文件也可以配置 list 集合,如下所示:

dbtypes:
 name:
  - mysql
  - sqlserver
  - db2

集合的讀取和對象一樣,也是使用 @ConfigurationProperties 來讀取的.

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * 配置集合
 */
@ConfigurationProperties("dbtypes")
@Component
@Data
public class DbType {
    private List<String> name;
}

訪問集合的實現(xiàn)如下:

@RequestMapping("/yml")
@RestController
public class ReadymlController {
    @Autowired
    private DbType dbType;
    @RequestMapping("/readDbtype")
    public String readDbtype() {
        return "從yml中獲取配置文件readDbtype: "+dbType;
    }
}

5.2.4 配置Map

配置文件也可以配置 map

maptypes:
  map:
    k1: 1
    k2: 2
    k3: 3

Map的讀取和對象一樣,也是使用 @ConfigurationProperties 來讀取的

import java.util.Map;
@ConfigurationProperties("maptypes")
@Component
@Data
public class MapType {
    private Map<String,String> map;
}

打印類實現(xiàn)如下:

@RequestMapping("/yml")
@RestController
public class ReadymlController {
    @Autowired
    private MapType mapType;
        @RequestMapping("/readMaptype")
    public String readMaptype() {
        return "從yml中獲取配置文件readMaptype: "+mapType;
    }
}

5.3 yml 優(yōu)缺點

優(yōu)點:

1. 可讀性高,寫法簡單, 易于理解。
2. 支持更多的數(shù)據(jù)類型, 可以簡單表達對象, 數(shù)組, List,Map等數(shù)據(jù)形態(tài).
3. 支持更多的編程語言, 不止是Java中可以使用, 在Golang, Python, Ruby, JavaScript中也可以使用。

缺點:

1. 不適合寫復雜的配置文件
2. 對格式有較強的要求(一個空格可能會引起一場血案)

6. 綜合性練習

6.1 驗證碼案例

隨著安全性的要求越來越高, 目前項目中很多都使用了驗證碼, 驗證碼的形式也是多種多樣, 更復雜的圖形驗證碼和行為驗證碼已經(jīng)成為了更流行的趨勢.

驗證碼的實現(xiàn)方式很多, 網(wǎng)上也有比較多的插件或者工具包可以使用, 本文選擇使用 Hutool工具包 來實現(xiàn).

6.1.1 Hutool 工具包介紹

詳細見鏈接: Hutool

1. 原理

驗證碼可以客戶端生成, 也可以服務器生成. 對于普通的字符驗證碼, 后端通常分兩部分.
一是生成驗證碼內(nèi)容, 根據(jù)驗證碼內(nèi)容干擾項等, 生成圖片, 返回給客戶端
二是把驗證碼內(nèi)容存儲起來, 校驗時取出來進行對比. Hutool 把驗證碼存儲在Session里.

2. 使用前需引入Hutool 依賴.

<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-captcha</artifactId>
			<version>5.8.16</version>
		</dependency>

6.1.2 需求

界面如下圖所示:
1. 頁面生成驗證碼
2. 輸入驗證碼, 點擊提交, 驗證用戶輸入驗證碼是否正確, 正確則進行頁面跳轉(zhuǎn).

6.1.3 準備工作

創(chuàng)建項目(captcha), 引入SpringMVC的依賴包, 把前端頁面放在項目中。

gitte鏈接: 薯條不要番茄醬

6.1.4 約定前后端交互接口

需求分析

后端需要提供兩個服務
1. 生成驗證碼, 并返回驗證碼
2. 校驗驗證碼是否正確.

接口定義:

1. 生成驗證碼

請求: captcha / get
參數(shù): session 存儲圖片上的答案,方便比較.
返回值: 無.

2. 校驗驗證碼是否正確.

請求: captcha / check
參數(shù): inputCode, session
返回值: true 或 false.

6.1.5 實現(xiàn)服務器端代碼

1. 引入依賴

<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-captcha</artifactId>
			<version>5.8.16</version>
		</dependency>

2. 通過配置 yml 文件

captcha:
  width: 200
  height: 100
  session:
    key: captcha_session_key
    date: captcha_session_date

3. CaptchaController 文件代碼如下:

@RequestMapping("/captcha")
@RestController
public class CaptchaController {
    private final static long session_valid_timeout = 60 * 1000;
    @Autowired
    private CaptchaProperties captchaProperties;
    @RequestMapping("/get")
    public void getCaptcha(HttpSession session, HttpServletResponse  response) {//響應中的所有數(shù)據(jù)都可以去 response中拿.
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());
        //抓包發(fā)現(xiàn)該請求沒有ContentType,但是 Spring 默認會返回 ContentType.
        response.setContentType("image/jpeg");
        //禁止緩存
        response.setHeader("Progma","No-cache");
        //圖形驗證碼寫出,可以寫出到文件,也可以寫出到流
        try {
            lineCaptcha.write(response.getOutputStream());
            String code = lineCaptcha.getCode();//拿到驗證碼答案.
            //存儲sesion
            session.setAttribute(captchaProperties.getSession().getKey(),code);
            session.setAttribute(captchaProperties.getSession().getDate(),new Date());//記錄設置session時的時間
            response.getOutputStream().close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /*
    不同用戶訪問 /captcha/check , 拿到的session是不同的, 之前我們說過 sessionId 是唯一的.
    那么session是怎么拿到的呢? 先從 HttpServletRequest中拿了 cookie, 在從cookie中 拿 sessionId
    再根據(jù) sessionId 拿到 session, 不同用戶的 sessionId 不同, session自然不同。
    簡單理解 就是程序本身支持多線程.
     */
    @RequestMapping("/check")
    public Boolean check(String inputCode, HttpSession session) {
        //驗證碼生成的內(nèi)容, 和用戶輸入的進行比較
        //session 獲取信息
        //校驗
        if(!StringUtils.hasLength(inputCode)) {
            return false;
        }
        String saveCode = (String)session.getAttribute(captchaProperties.getSession().getKey());
        Date saveDate = (Date) session.getAttribute(captchaProperties.getSession().getDate());
        if(saveCode.equalsIgnoreCase(inputCode)) {
            //判斷驗證碼是否過期
            if(saveDate != null && System.currentTimeMillis()- saveDate.getTime() < session_valid_timeout) {
                return true;
            }
        }
        return false;
    }
}

6.1.6 調(diào)整前端頁面代碼

在 index.html中, 補充ajax代碼, 點擊提交按鈕, 發(fā)送請求去服務端進行校驗.

    $("#checkCaptcha").click(function () {
        $.ajax({
          url: "captcha/check",
          type: "post",
          data: {
            inputCode: $("#inputCaptcha").val()
          },
          success:function(result) {
            if(result==true) {
              location.href="success.html" rel="external nofollow" ;
            }else {
              alert("驗證碼錯誤或者過期");
            }
          }
        });
    });

6.1.7 運行測試

通過 URL http://127.0.0.1:8080/index.html 訪問服務

輸入驗證碼

到此這篇關于零基礎全面解析SpringBoot配置文件(結(jié)合驗證碼案例)的文章就介紹到這了,更多相關SpringBoot配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論