零基礎(chǔ)全面解析SpringBoot配置文件(結(jié)合驗證碼案例)
1. 配置文件作用
計算機(jī)上有數(shù)以千計的配置文件, 我們使用的絕大多數(shù)軟件, 比如瀏覽器, 微信, Idea, 甚至電腦, 手機(jī), 都離不開配置文件. 我們可能永遠(yuǎn)不會直接與其中的大部分文件打交道,但它們確實以不同的形式散落在我們的計算機(jī)上, 比如 C:\Users, C:\Windows文件夾, 以及各種 *.config, *.xml 文件
配置文件主要是為了解決硬編碼帶來的問題, 把可能會發(fā)生改變的信息, 放在一個集中的地方, 當(dāng)我們啟動某個程序時, 應(yīng)用程序從配置文件中讀取數(shù)據(jù), 并加載運(yùn)行.
硬編碼是將數(shù)據(jù)直接嵌入到程序或其他可執(zhí)行對象的源代碼中, 也就是我們常說的"代碼寫死".
使用配置文件, 可以使程序完成用戶和應(yīng)用程序的交互, 或者應(yīng)用程序與其他應(yīng)用程序的交互。
SpringBoot配置文件
SpringBoot 支持并定義了配置文件的格式, 也在另一個層面達(dá)到了規(guī)范其他框架集成到SpringBoot的目的.
很多項目或者框架的配置信息也放在配置文件中, 比如:
• 項目的啟動端口: SpringBoot內(nèi)置了Tomcat服務(wù)器, 默認(rèn)端口號是8080。
• 數(shù)據(jù)庫的連接信息(包含用戶名和密碼的設(shè)置): 對JDBC進(jìn)行了更深層次的封裝.讓用戶通過簡單幾行代碼就可完成數(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 文件的使用。
當(dāng)應(yīng)用程序啟動時, Spring Boot會自動從 classpath 路徑找到并加載
application.properties 和 application.yaml 或者 application.yml 文件。

如上圖所示 .properties 和 .yml 可以并存在于一個項目中 ,
當(dāng) .properties 和 .yml 并存時,兩個配置都會加載. 如果配置文件內(nèi)容有沖突, 則以 .properties 為主, 也就是
.properties 優(yōu)先級更高. 需要注意的是雖然 .properties 可以和 .yml 共存, 但是實際開發(fā)當(dāng)中, 我們通常會采取一種統(tǒng)一的配置文件格式, 這樣方便后續(xù)的維護(hù),降低出故障的概率。
4. properties 配置文件說明
properties 配置文件是最早期的配置文件格式,也是創(chuàng)建 SpringBoot 項目 默認(rèn)的配置文件。
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)容和細(xì)節(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;
}
}運(yùn)行程序, 并在瀏覽器訪問 http://127.0.0.1:9090/yml/readyml
有如下結(jié)果說明獲取成功.

4.3 properties 缺點分析
properties 配置文件中會有很多的冗余的信息,比如:

想要解決這個問題,就可以使用 yml 配置文件的格式化了.
5. yml 配置文件說明
yml 全稱 Yet Another Markup Language 翻譯成中文就是 “另一種標(biāo)記語言”.
5.1 yml 基本語法
yml 是樹形結(jié)構(gòu)的配置?件,它的基礎(chǔ)語法是"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那樣重復(fù)去寫 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
運(yùn)行結(jié)果:

5.2.1.2 注意事項:value 值加單雙引號
字符串默認(rèn)不用加上單引號或者雙引號,如果加英文的單雙引號可以表示特殊的含義。
在 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é)果可以看出:
字符串默認(rèn)不用加上單引號或者雙引號.
單引號會轉(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")//從配置文件中獲取默認(rèn)值.
@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;
}
}運(yùn)行結(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: 3Map的讀取和對象一樣,也是使用 @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ù)類型, 可以簡單表達(dá)對象, 數(shù)組, List,Map等數(shù)據(jù)形態(tài).
3. 支持更多的編程語言, 不止是Java中可以使用, 在Golang, Python, Ruby, JavaScript中也可以使用。
缺點:
1. 不適合寫復(fù)雜的配置文件
2. 對格式有較強(qiáng)的要求(一個空格可能會引起一場血案)
6. 綜合性練習(xí)
6.1 驗證碼案例
隨著安全性的要求越來越高, 目前項目中很多都使用了驗證碼, 驗證碼的形式也是多種多樣, 更復(fù)雜的圖形驗證碼和行為驗證碼已經(jīng)成為了更流行的趨勢.
驗證碼的實現(xiàn)方式很多, 網(wǎng)上也有比較多的插件或者工具包可以使用, 本文選擇使用 Hutool工具包 來實現(xiàn).
6.1.1 Hutool 工具包介紹
詳細(xì)見鏈接: Hutool
1. 原理
驗證碼可以客戶端生成, 也可以服務(wù)器生成. 對于普通的字符驗證碼, 后端通常分兩部分.
一是生成驗證碼內(nèi)容, 根據(jù)驗證碼內(nèi)容干擾項等, 生成圖片, 返回給客戶端
二是把驗證碼內(nèi)容存儲起來, 校驗時取出來進(jìn)行對比. Hutool 把驗證碼存儲在Session里.
2. 使用前需引入Hutool 依賴.
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-captcha</artifactId> <version>5.8.16</version> </dependency>
6.1.2 需求
界面如下圖所示:
1. 頁面生成驗證碼
2. 輸入驗證碼, 點擊提交, 驗證用戶輸入驗證碼是否正確, 正確則進(jìn)行頁面跳轉(zhuǎn).

6.1.3 準(zhǔn)備工作
創(chuàng)建項目(captcha), 引入SpringMVC的依賴包, 把前端頁面放在項目中。
gitte鏈接: 薯條不要番茄醬

6.1.4 約定前后端交互接口
需求分析
后端需要提供兩個服務(wù)
1. 生成驗證碼, 并返回驗證碼
2. 校驗驗證碼是否正確.
接口定義:
1. 生成驗證碼
請求: captcha / get
參數(shù): session 存儲圖片上的答案,方便比較.
返回值: 無.
2. 校驗驗證碼是否正確.
請求: captcha / check
參數(shù): inputCode, session
返回值: true 或 false.
6.1.5 實現(xiàn)服務(wù)器端代碼
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_date3. 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) {//響應(yīng)中的所有數(shù)據(jù)都可以去 response中拿.
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());
//抓包發(fā)現(xiàn)該請求沒有ContentType,但是 Spring 默認(rèn)會返回 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());//記錄設(shè)置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)容, 和用戶輸入的進(jìn)行比較
//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中, 補(bǔ)充ajax代碼, 點擊提交按鈕, 發(fā)送請求去服務(wù)端進(jìn)行校驗.
$("#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 運(yùn)行測試
通過 URL http://127.0.0.1:8080/index.html 訪問服務(wù)

輸入驗證碼

到此這篇關(guān)于零基礎(chǔ)全面解析SpringBoot配置文件(結(jié)合驗證碼案例)的文章就介紹到這了,更多相關(guān)SpringBoot配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot?2.7?集成?RabbitMQ?3.9?版本依賴沖突問題解決
文章主要討論了在使用SpringBoot2.7與RabbitMQ時可能出現(xiàn)的依賴沖突問題,建議優(yōu)先使用SpringBoot自帶的依賴管理,避免手動指定不匹配的版本,并通過查看依賴樹、清理手動配置、強(qiáng)制對齊版本等步驟解決沖突,感興趣的朋友一起看看吧2026-05-05
MyBatis-Plus動態(tài)表名使用selectPage方法不生效問題解析與解決方案
MyBatis-Plus是MyBatis的增強(qiáng)工具,動態(tài)表名是MyBatis-Plus的一個重要功能之一,一些開發(fā)者在使用selectPage方法時可能會遇到動態(tài)表名不生效的問題,本文將深入分析這個問題的原因,并提供相應(yīng)的解決方案,需要的朋友可以參考下2023-12-12
關(guān)于spring-security(記住密碼,CSRF)
文章主要介紹了Spring Security中的PersistentTokenRepository、CSRF保護(hù)機(jī)制以及如何在登錄頁面添加記住我功能,并分享了相關(guān)實現(xiàn)代碼和配置2024-11-11
SpringBoot+minio+kkfile實現(xiàn)文件預(yù)覽功能
在現(xiàn)代的 Web 應(yīng)用中,文件預(yù)覽功能是提升用戶體驗的重要部分,尤其是在文檔管理系統(tǒng)中,本文將帶你逐步實現(xiàn)如何在 Spring Boot 項目中集成 MinIO(一個對象存儲系統(tǒng))與 KKFileView(一個開源文件預(yù)覽工具),以實現(xiàn)對各種類型文件的在線預(yù)覽,需要的朋友可以參考下2024-12-12
各種格式的編碼解碼工具類分享(hex解碼 base64編碼)
這篇文章主要介紹了各種格式的編碼解碼工具類,集成Commons-Codec、Commons-Lang及JDK提供的編解碼方法2014-01-01
Spring使用JdbcTemplate輕量完成數(shù)據(jù)庫增刪改查的實戰(zhàn)指南
JdbcTemplate?是?Spring?提供的輕量級數(shù)據(jù)庫操作工具,適合直接寫?SQL,又不想寫一堆?JDBC?模板代碼的場景,下面我們就來看看如何使用JdbcTemplate輕量完成數(shù)據(jù)庫增刪改查吧2026-06-06
Spring中事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API詳解
這篇文章主要介紹了Spring中事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API詳解,事務(wù)管理是指對事務(wù)進(jìn)行管理和控制,以確保事務(wù)的正確性和完整性,事務(wù)管理的作用是保證數(shù)據(jù)庫的數(shù)據(jù)操作的一致性和可靠性,需要的朋友可以參考下2023-08-08
springboot的logging.group日志分組方法源碼流程解析
這篇文章主要為大家介紹了springboot的logging.group日志分組方法源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

