文章目录
- 一、什么是配置文件
- [二、Spring Boot 配置文件](#二、Spring Boot 配置文件)
-
- [2.1 概念](#2.1 概念)
- [2.2 配置文件的格式](#2.2 配置文件的格式)
- [三、properties 配置文件说明](#三、properties 配置文件说明)
-
- [3.1 properties 基本语法](#3.1 properties 基本语法)
- [3.2 读取配置文件](#3.2 读取配置文件)
- [3.3 properties 缺点分析](#3.3 properties 缺点分析)
- [四、 yml 配置文件说明](#四、 yml 配置文件说明)
-
- [4.1 yml 基本语法](#4.1 yml 基本语法)
- [4.2 yml 的使用](#4.2 yml 的使用)
- [4.3 关于单双引号](#4.3 关于单双引号)
- [4.4 yml 优缺点](#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 之间是以"="连接的,如:
java
# 配置项⽬端⼝号
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 注解使用" ${} "的格式读取
java
mykey.key1 = bite #properties 配置
java
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 来读取
java
# 使用yml连接数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: root
2. yml 配置不同数据类型及 null
使用 @Value 来读取
java
# 字符串
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 来读取
java
# 第一种写法
student:
id: 1
name: Java
age: 18
# 第二种写法(行内写法)
student: {id: 1,name: Java,age: 18}
java
@RestController
public class StudentController {
@Autowired
private Student student;
@RequestMapping("/readStudent")
public String readStudent(){
return student.toString();
}
}
java
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
java
student:
id: 1
name: Java
age: 18
4. 配置集合
用 @ConfigurationProperties 来读取
java
dbtypes:
name:
- mysql
- sqlserver
- db2
java
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
java
@RestController
public class ReadYml2 {
@Autowired
private ListConfig listConfig;
@RequestMapping("/readList")
public String readList(){
return listConfig.toString();
}
}
5. 配置Map
用 @ConfigurationProperties 来读取
java
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}
java
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
java
@RestController
public class ReadYml2 {
@Autowired
private 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里
-
引入依赖
java
<dependency>
<groupId>com.oopsguy.kaptcha</groupId>
<artifactId>kaptcha-spring-boot-starter</artifactId>
version>1.0.0-beta-2</version>
</dependency>
- 生成验证码
- 代码生成
- 通过配置文件生成
后端代码
java
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";
//验证码的有效时间:ms
private 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;
}
}
前端代码
html
<!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>
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>