目录
[1. 配置文件的作用](#1. 配置文件的作用)
[2. 配置文件的格式](#2. 配置文件的格式)
[3. properties配置文件介绍](#3. properties配置文件介绍)
[3.1 properties语法](#3.1 properties语法)
[3.2 读取配置文件](#3.2 读取配置文件)
[3.3. properties的缺点](#3.3. properties的缺点)
[4. yml配置文件介绍](#4. yml配置文件介绍)
[4.1 yml语法](#4.1 yml语法)
[4.2 使用yml配置不同的数据类型](#4.2 使用yml配置不同的数据类型)
[4.3 yml配置的读取(使用到初始化注解@PostConstruct)](#4.3 yml配置的读取(使用到初始化注解@PostConstruct))
[4.4 配置对象(@ConfigurationProperties注解)](#4.4 配置对象(@ConfigurationProperties注解))
[4.5 配置集合](#4.5 配置集合)
[4.6 配置Map](#4.6 配置Map)
[4.7 yml的优缺点](#4.7 yml的优缺点)
[5. 验证码案例练习](#5. 验证码案例练习)
[5.1 需求](#5.1 需求)
[5.2 hutool工具介绍](#5.2 hutool工具介绍)
[5.3 接口定义](#5.3 接口定义)
[5.4 后端代码实现](#5.4 后端代码实现)
[5.5. 前端代码实现](#5.5. 前端代码实现)
1. 配置文件的作用
我们在使用Spring Boot框架时候,内置了Tomcat,启动端口号为8080,如果该端口号被占用,此时就可以在配置文件中设置指定端口号,配置文件里面也可以设置数据库的连接信息等内容。
2. 配置文件的格式
Spring Boot提供了三种配置文件的格式:
application.properties
application.yaml
application.yml
这里的yml是yaml的缩写,我们一般使用yml后缀的配置文件,这两种配置文件的语法一样。
如果一个项目同时存在properties和yml两种配置文件,如果配置信息冲突会以properties配置文件的信息为主。
3. properties配置文件介绍
3.1 properties语法
该配置文件里面的信息都是以 键值对的形式存在的,中间使用=连接,如果要注释,使用#,每个单词需要小写,并且每个单词之间使用 . 来分割。
java
spring.application.name=spring-ioc-demo
#配置项目端口号
server.port=8090
我们还可以自定义配置,自己起一个建名,对应一个值。
java
key=1
3.2 读取配置文件
我们可以在Java代码中读取配置文件中的内容,我们需要使用@Value注解,然后搭配${}使用来获取配置信息:
java
@RequestMapping("/proper")
@ResponseBody
@Controller
public class propertiesController {
@Value("${key}")
private String key;
@RequestMapping("/read")
public String getValue() {
return "获取配置信息" + key;
}
}

如果我们想要直接在控制台看到结果,我们可以使用@PostConstruct注解,这是一个初始化注解,就是在初始化时候,执行该注解的方法。
java
@RequestMapping("/proper")
@ResponseBody
@Controller
public class propertiesController {
@Value("${key}")
private String key;
@PostConstruct
public void getValue1() {
System.out.println("获取配置信息: " + key);
}
}

3.3. properties的缺点
java
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
这是数据库的配置信息,我们可以发现通过properties的语法来写的配置信息会有很多冗余的内容,此时就可以使用yml配置文件来解决这个问题。
4. yml配置文件介绍
4.1 yml语法
yml的语法是:key和value之间通过 英文冒号 + 空格 分开,然后设置配置文件,不同单词之间会换行:
java
server:
port: 8080
key: 1
比如上面的数据库配置文件在yml里面的格式就是:
java
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC
username: name
password: password
4.2 使用yml配置不同的数据类型
java
# 字符串
string:
value: hello
# 布尔值
boolean:
value: true
# 整数
int:
value: 11
# 浮点数
float:
value: 3.1415
# null ~表示null
null2:
value: ~
# 空字符串 可以使用'' 或者 ""
empty:
value: ''
4.3 yml配置的读取(使用到初始化注解@PostConstruct)
yml的读取跟properties一样都是使用@Value注解来读取的·。
yml配置文件里面的代码:
java
name: zhangsan
age: 12
java
@ResponseBody
@Controller
public class ymlController {
@Value("${name}")
private String name;
@Value("${age}")
private int age;
@PostConstruct
public void getYml() {
System.out.println("name=" + name + ", age=" + age);
}
}
4.4 配置对象(@ConfigurationProperties注解)
yml还可以设置对象:
java
person:
id: 1
name: zhangsan
age: 20
Person类:
通过@ConfigurationProerties注解来将配置文件里面的对象属性放到该类对应的属性中,并使用@Configuration注解将该类交给容器管理,
java
@ConfigurationProperties(prefix = "person")
@Configuration
@Data
public class Person {
private int id;
private String name;
private int age;
}
使用该类:
通过@Autowied注解注入person对象
java
@ResponseBody
@Controller
public class ymlController {
@Autowired
private Person person;
@PostConstruct
public void getYml() {
System.out.println("person: " + person);
}
}
4.5 配置集合
yml配置代码:
java
#集合
dbtypes:
name:
- hello1
- hello2
- hello3
这里创建一个类,包含集合属性来接受。
java
@ConfigurationProperties(prefix = "dbtypes")
@Configuration
@Data
public class DbTypes {
private List<String> name;
}
最后可以成功的使用该对象:
java
@ResponseBody
@Controller
public class ymlController {
@Autowired
private DbTypes dbTypes;
@PostConstruct
public void getYml() {
System.out.println("dbTypes: " + dbTypes);
}
}
4.6 配置Map
map的配置文件:
java
#Map
dbtypes:
ball:
k1: v1
k2: v2
k3: v3
使用Map类型来接收:
java
@ConfigurationProperties(prefix = "dbtypes")
@Configuration
@Data
public class DbTypes {
private Map<String, String> ball;
}
最后成功注入:
java
@ResponseBody
@Controller
public class ymlController {
@Autowired
private DbTypes dbTypes;
@PostConstruct
public void getYml() {
System.out.println("dbTypes: " + dbTypes);
}
}
4.7 yml的优缺点
优点:
可读性好,写法简单,容易理解。可以适用于多种编程语言。可以表示更多的数据类型,比如:对象,集合,Map等类型。
缺点:
对于一些比较复杂的配置文件,编写也比较困难,需要注意格式,可读性也会差点。
对格式要求很严格。
5. 验证码案例练习
5.1 需求
需要我们输入验证码,然后点击提交,验证码匹配就跳转到新页面,不正确就弹窗。

5.2 hutool工具介绍
在我们实现验证码功能之前,先介绍一个Java开发工具类包,这里面包含了很多的工具类,通过静态方法实现,也包含生成验证码的工具类,官网如下:
我们就可以使用它提供的方法来生成验证码,之类需要引入依赖,在官方文档中有,我们使用下面的就行。

生成验证码的类包含很多方法:

5.3 接口定义
生成验证码:
请求:/captcha/getCaptcha
响应:验证码的图片内容
检验验证码:
请求:/captcha/check
请求参数:captcha= 用户输入的验证码
响应:true或者false
5.4 后端代码实现
生成验证码接口和判断验证码是否正确的接口代码:
java
package com.sias.captcha.controller;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import com.sias.captcha.model.CaptchaProperties;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.IOException;
import java.util.Date;
@RequestMapping("/captcha")
@Controller
@ResponseBody
public class CaptchaController {
@Autowired
private CaptchaProperties captchaProperties;
//定义过期时间(1分钟)
private static final Long VALID_TIME = 60 * 1000L;
@RequestMapping("/getCaptcha")
public void getCaptcha(HttpServletResponse response, HttpSession session) {
//设置响应数据类型
response.setContentType("image/jpeg");
try {
//生成验证码
//定义图形验证码的长、宽、验证码字符数、干扰线宽度
ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight(), 4, 4);
String code = captcha.getCode();
session.setAttribute(captchaProperties.getSession().getKey(), code);
session.setAttribute(captchaProperties.getSession().getDate(), new Date());
//将验证码图片放到响应中
captcha.write(response.getOutputStream());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@RequestMapping("/check")
public boolean check(String captcha, HttpSession session) {
//判断验证码是否为空
if(!StringUtils.hasLength(captcha)) {
return false;
}
String code = (String)session.getAttribute(captchaProperties.getSession().getKey());
Date date = (Date)session.getAttribute(captchaProperties.getSession().getDate());
if(captcha.equalsIgnoreCase(code) && date != null &&
System.currentTimeMillis() - date.getTime() < VALID_TIME) {
return true;
}
return false;
}
}
这里使用了配置文件来设置一些数据,比如,验证码框的长和宽,验证码的内容和生成验证码的时间存在session里面的key名字。这里我们就需要创建一个类来管理这些属性。
**注意:**这里的内部类要使用静态的,因为我们把CaptchaProrerties类交给Spring管理,如果内部类是非静态的,创建就依赖于外部类,此时外部类对象还没有创建,无法创建内部类对象。
java
@ConfigurationProperties(prefix = "captcha")
@Configuration
@Data
public class CaptchaProperties {
private Integer width;
private Integer height;
private Session session;
@Data
public static class Session {
private String key;
private String date;
}
}
配置文件里面的内容:
java
captcha:
width: 150
height: 50
session:
key: CAPTCHA_SESSION_KEY
date: CAPTCHA_SESSION_DATE
5.5. 前端代码实现
index.html页面:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<title>验证码</title>
<style>
#inputCaptcha {
height: 30px;
vertical-align: middle;
}
#verificationCodeImg{
vertical-align: middle;
}
#checkCaptcha{
height: 40px;
width: 100px;
}
</style>
</head>
<body>
<h1>输入验证码</h1>
<div id="confirm">
<input type="text" name="inputCaptcha" id="inputCaptcha">
<img id="verificationCodeImg" src="/captcha/getCaptcha" style="cursor: pointer;" title="看不清?换一张" />
<input type="button" value="提交" id="checkCaptcha">
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
$("#verificationCodeImg").click(function(){
$(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();
});
$("#checkCaptcha").click(function () {
$.ajax({
type: "post",
url: "/captcha/check",
data: {
captcha: $("#inputCaptcha").val()
},
success: function(result) {
if(result) {
location.href = "success.html";
}else {
alert("验证码错误,请重新输入");
}
}
})
});
</script>
</body>
</html>
success.html页面:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>验证成功页</title>
</head>
<body>
<h1>验证成功</h1>
</body>
</html>