文章目录
- 一、什么是配置文件
- 二、Spring Boot 配置文件
- 2.1 概念
- 2.2 配置文件的格式
- 三、properties 配置文件说明
- 3.1 properties 基本语法
- 3.2 读取配置文件
- 3.3 properties 缺点分析
- 四、 yml 配置文件说明
- 4.1 yml 基本语法
- 4.2 yml 的使用
- 4.3 关于单双引号
- 4.4 yml 优缺点
- 五、验证码案例
一、什么是配置文件
配置文件主要是为了解决硬编码带来的问题, 把可能会发生改变的信息, 放在⼀个集中的地方,当我们启动某个程序时, 应用程序从配置文件中读取数据, 并加载运行
硬编码是将数据直接嵌入到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死"
二、Spring Boot 配置文件
2.1 概念
SpringBoot支持并定义了配置文件的格式,也在另⼀个层面达到了规范其他框架集成到SpringBoot的目的
很多项目或者框架的配置信息也放在配置文件中,比如:
- 项目的启动端口
- SpringBoot内置了Tomcat服务器, 默认端口号是8080。但是该端口号可能被占用,所以就需要程序员自定义端口号
- 数据库的连接信息(包含用户名和密码的设置)
- 第三方系统的调用密钥等信息
- 用于发现和定位问题的普通日志和异常日志等
2.2 配置文件的格式
Spring Boot 支持三种格式:properties、yml、yaml,但是只支持下面三种配置文件:
Spring Boot 配置文件有以下三种:
- application.properties
- application.yml
- application.yaml
yml 为yaml的简写, 实际开发中出现频率最高,yaml 和yml 的使用方式⼀样。
- 当应用程序启动时, Spring Boot会自动从classpath路径找到并加载application.properties 和 application.yaml 或者 application.yml 文件
- 也可以通过spring.config.name指定文件路径和名称
三、properties 配置文件说明
properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项目默认的配置文件
3.1 properties 基本语法
properties 是以键值的形式配置的,key 和 value 之间是以"="连接的,如:
# 配置项⽬端⼝号
server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&
spring.datasource.username=root
spring.datasource.password=root
3.2 读取配置文件
@Value 注解使用" ${} "的格式读取
mykey.key1 = bite #properties 配置
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PropertiesController {@Value("${mykey.key1}")private String key1;@RequestMapping("/key")public String key(){return "读取到值:"+key1;}
}
3.3 properties 缺点分析
是以 key-value 的形式配置的,会有很多冗杂的信息。yml格式则很好地避免了这个问题。
四、 yml 配置文件说明
4.1 yml 基本语法
yml 是树形结构的配置文件,它的基础语法是"key: value"。
key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略
4.2 yml 的使用
1. 使用yml连接数据库
使用 @Value 来读取
# 使用yml连接数据库
spring:datasource:url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=falseusername: rootpassword: root
2. yml 配置不同数据类型及 null
使用 @Value 来读取
# 字符串
string.value: Hello# 布尔值,true或false
boolean.value: true
boolean.value1: false# 整数
int.value: 10# 浮点数
float.value: 3.14159# Null,~代表null
null.value: ~# "" 空字符串
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value: ''
3. 配置对象
用 @ConfigurationProperties 来读取
# 第一种写法
student:id: 1name: Javaage: 18# 第二种写法(行内写法)
student: {id: 1,name: Java,age: 18}
@RestController
public class StudentController {@Autowiredprivate Student student;@RequestMapping("/readStudent")public String readStudent(){return student.toString();}
}
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {private int id;private String name;private int age;
}
student:id: 1name: Javaage: 18
4. 配置集合
用 @ConfigurationProperties 来读取
dbtypes:name:- mysql- sqlserver- db2
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {private List<String> name;
}
@RestController
public class ReadYml2 {@Autowiredprivate ListConfig listConfig;@RequestMapping("/readList")public String readList(){return listConfig.toString();}
}
5. 配置Map
用 @ConfigurationProperties 来读取
maptypes:map:k1: kk1k2: kk2k3: kk3maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {private HashMap<String,String> map;
}
@RestController
public class ReadYml2 {@Autowiredprivate MapConfig mapConfig;@RequestMapping("/readMap")public String readStudent(){return mapConfig.toString();}
}
4.3 关于单双引号
- 字符串默认不用加上单引号或者双引号
- 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串
- 双引号不会转义字符串里面的特殊字符, 特殊字符会表示本身的含义
4.4 yml 优缺点
- 优点
- 可读性高,写法简单, 易于理解
- 支持更多的数据类型, 可以简单表达对象, 数组,List,Map等数据形态
- 支持更多的编程语言, 不止是Java中可以使用,在Golang, Python, Ruby, JavaScript中也可以使用
- 缺点
- 不适合写复杂的配置文件
- 对格式有较强的要求(忘记空格检查会很麻烦)
五、验证码案例
(1)Kaptcha 插件介绍
Kaptcha 是Google的⼀个高度可配置的实用验证码生成工具
-
原理
验证码可以客户端生成,也可以服务器生成。 对于普通的字符验证码,后端通常分两部分- 是生成验证码内容, 根据验证码内容和干扰项等, 生成图片, 返回给客户端
- 是把验证码内容存储起来, 校验时取出来进行对比
kaptcha插件选择把验证码存储在Session里
-
引入依赖
<dependency><groupId>com.oopsguy.kaptcha</groupId><artifactId>kaptcha-spring-boot-starter</artifactId>version>1.0.0-beta-2</version>
</dependency>
- 生成验证码
- 代码生成
- 通过配置文件生成
后端代码
package com.bite.demo.controller;import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;
import java.util.Date;@RequestMapping("/admin")
@RestController
public class CaptchaController {//企业标准(建议)://常量定义: key: 全部大写, 单词之间使用下划线分割 value: 通常是小写, 以下划线分割private static final String KAPTCHA_SESSION_KEY = "HOME_KAPTCHA_SESSION_KEY";private static final String KAPTCHA_SESSION_DATE = "HOME_KAPTCHA_SESSION_DATE";//验证码的有效时间:msprivate static final Long SESSION_TIMEOUT = 60 * 1000L;//验证成功: true//验证失败: false/*** 1. 从Session中获取到生成的验证码* 2. 比对前端传递的验证码和Session中存储的是否一样*/@RequestMapping("/check")public Boolean check(String captcha, HttpSession session){if (!StringUtils.hasLength(captcha)){return false;}//从Session中获取验证码String saveCaptcha = (String)session.getAttribute(KAPTCHA_SESSION_KEY);Date saveDate = (Date)session.getAttribute(KAPTCHA_SESSION_DATE);//比对验证码if (captcha.equals(saveCaptcha)){//比对日期if (saveDate==null || System.currentTimeMillis() - saveDate.getTime()<SESSION_TIMEOUT){return true;}}return false;}
}
前端代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><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="/admin/captcha" 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>$(function () {$("#verificationCodeImg").click(function () {$(this).hide().attr('src', '/admin/captcha?dt=' + new Date().getTime()).fadeIn();// $(this).attr('src', '/admin/captcha?dt=' + new Date().getTime());});$("#checkCaptcha").click(function () {$.ajax({type: "get",url: "/admin/check",data: {captcha: $("#inputCaptcha").val()},success: function (result) {if (result) {location.href = "success.html";// location.assign("success.html");} else {alert("验证码错误");}}});});});</script>
</body></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>