目录
[1 SpringBoot配置文件](#1 SpringBoot配置文件)
[2 配置文件的快速入手](#2 配置文件的快速入手)
[3 配置文件格式](#3 配置文件格式)
[4 properties配置文件说明](#4 properties配置文件说明)
[4.1 properties基本语法](#4.1 properties基本语法)
[4.2 读取配置文件](#4.2 读取配置文件)
[4.3 properties缺点](#4.3 properties缺点)
[5 yml配置文件](#5 yml配置文件)
[5.1 yml基本语法](#5.1 yml基本语法)
[5.2 yml配置不同数据类型及null](#5.2 yml配置不同数据类型及null)
[5.3 配置对象](#5.3 配置对象)
[5.4 配置集合](#5.4 配置集合)
[5.5 配置Map](#5.5 配置Map)
[5.6 yml优缺点](#5.6 yml优缺点)
[6 综合性练习](#6 综合性练习)
[6.1 验证码案例](#6.1 验证码案例)
[6.2 Kaptcha插件](#6.2 Kaptcha插件)
[6.2.1 原理](#6.2.1 原理)
[6.2.2 引入依赖](#6.2.2 引入依赖)
[6.2.3 生成验证码](#6.2.3 生成验证码)
[6.3 页面生成验证码](#6.3 页面生成验证码)
[6.3.1 准备工作](#6.3.1 准备工作)
[6.3.2 约定前后端交互接口](#6.3.2 约定前后端交互接口)
[6.3.3 实现服务器端代码](#6.3.3 实现服务器端代码)
[6.3.4 调整前端代码](#6.3.4 调整前端代码)
[6.3.5 运行测试](#6.3.5 运行测试)
[7 总结](#7 总结)
1 SpringBoot配置文件
配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据并进行加载
SpringBoot支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到SpringBoot的目的,很多项目或者框架的配置信息也放在配置文件中,例如:
1)项目的启动端口
2)数据库的连接信息
3)第三方系统的调用密钥等信息
4)用于发现和定位问题的普通日志和异常日志等
2 配置文件的快速入手
Tomcat的默认端口是8080,所以在程序访问时的端口号也是8080,如果8080端口被占用了,则可以通过配置文件来修改服务的端口号,SpringBoot在创建项目时,就已经创建了配置文件
java
server.port=9090
只需要修改application.properties文件即可,重新运行程序,观察日志
此时Tomcat启动端口为9090,因此访问的时候就需要使用9090这个端口来访问
3 配置文件格式
SpringBoot配置文件有三种:
1)application.properties
2)application.yml
3)application.yaml
yml为yaml的简写,实际开发中出现的频率最高,它们使用方式一样,因此只介绍yml文件的使用
特殊说明:
1)理论上.properties和.yml可以并存于一个项目中,当.properties和.yml并存时,两个配置都会加载,如果配置文件内容有冲突,则以.properties为主,因此.properties优先级更高
2)在实际业务中,通常采用一种统一的配置文件格式
4 properties配置文件说明
properties配置⽂件是最早期的配置⽂件格式,也是创建SpringBoot项⽬默认的配置⽂件
4.1 properties基本语法
properties是以键值的形式配置的,key和value之间以"="连接,例如:
4.2 读取配置文件
如果在项目中,想要主动读取配置文件的内容,可以使用@Value注解来实现,@Value注解使用"${ }"格式读取,代码如下:
properties配置如下:
java
mykey.key=123
java
@RestController
public class PropertiesController {
@Value("${mykey.key}")
private String k;
@RequestMapping("/key")
public String key() {
return "读取的值:"+ k;
}
}
如果去掉$,就会把" "中的值赋值给当前变量
4.3 properties缺点
properties配置是以key-value的形式配置的,配置文件中有很多冗余信息
要解决这个问题,就可以使用yml配置文件的格式了
5 yml配置文件
yml是YAML的缩写,它的全称Yet Another Markup Language
5.1 yml基本语法
yml是树形结构的配置文件,**它的基础语法是"key:value",其中key和value之间使用英文冒号加空格的方式组成,**空格不可以省略
yml连接数据库代码展示
5.2 yml配置不同数据类型及null
yml配置读取的方式和properties相同,使用@Value注解即可,实现代码如下
java
@RestController
public class PropertiesController {
@Value("${string.key1}")
private String k1;
@Value("${string.key2}")
private Integer k2;
@Value("${string.key3}")
private String k3;
@PostConstruct
public void init() {
System.out.println("key1:" + k1);
System.out.println("key2:" + k2);
System.out.println("key3:" + k3);
System.out.println(StringUtils.hasLength(k3));
}
}
注意事项:value值加单双引号
java
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
java
@RestController
public class PropertiesController {
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
//@PostConstruct是在tomcat启动之前就打印
@PostConstruct
public void init() {
System.out.println("str1:" + str1);
System.out.println("str2:" + str2);
System.out.println("str3:" + str3);
}
}
从上述结果可以看出:
1)字符串默认不用加上单引号或者双引号
2)单引号会转译特殊字符,始终是一个普通字符串
3)双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义
5.3 配置对象
java
student:
id: 18
name: zhangsan
age: 19
java
@Component
@ConfigurationProperties(prefix = "student")
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
}
java
@RestController
public class StudentController {
@Autowired
public Student student;
@PostConstruct
public void init() {
System.out.println("student:" + student);
}
}
使用 @ConfigurationProperties来进行读取即可
5.4 配置集合
java
dbtype:
name:
-mysql
-sqlserver
-db2
java
@Component
@ConfigurationProperties(prefix = "dbtype")
@Data
public class DBType {
private String[] name;
}
java
@RestController
public class DBTypeController {
@Autowired
private DBType dbType;
@PostConstruct
public void init() {
System.out.println("dbtype:" + dbType + "length:" + dbType.getName().length);
}
}
上述输出的长度为1,是因为yml里面的-和mysql之间没有加空格
java
dbtype:
name:
- mysql
- sqlserver
- db2
5.5 配置Map
java
maptype:
map:
k1: 1
k2: 2
k3: 3
java
@Component
@ConfigurationProperties(prefix = "maptype")
@Data
public class Map {
private HashMap<String,String> map;
}
java
@RestController
public class MapController {
@Autowired
private Map map;
@PostConstruct
public void init() {
System.out.println("map:" + map + "length:" + map.getMap().size());
}
}
5.6 yml优缺点
优点:
1 可读性高,写法简单,易于理解
2 支持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态
3 支持更多的编程语言,不止在Java中可以使用,在Golang,Python中也可以使用
缺点:
1 不适合写复杂的配置文件
2 对格式有较强的要求(少写一个空格就会出错)
6 综合性练习
6.1 验证码案例
随着安全性的要求越来越高,在目前项目中都使用了验证码,而验证码的形式也是各种各样的
6.2 Kaptcha插件
6.2.1 原理
验证码可以客户端生成,也可以服务器生成,对于普通的字符验证码,后端代码通常分成两部分,一是生成验证码内容,根据验证码内容和干扰项等,生成图片并返回给客户端,二是把验证码内容存储起来,校验时取出来进行对比,kaptcha插件选择把验证码存储在Session⾥
6.2.2 引入依赖
java
<dependency>
<groupId>com.oopsguy.kaptcha</groupId>
<artifactId>kaptcha-spring-boot-starter</artifactId>
<version>1.0.0-beta-2</version>
</dependency>
6.2.3 生成验证码
通过配置文件生成验证码
java
kaptcha:
items:
home:
path: /home/captcha
session:
key: HOME_KAPTCHA_SESSION_KEY
date: HOME_KAPTCHA_SESSION_DATE
admin:
path: /admin/captcha
session:
key: ADMIN_KAPTCHA_SESSION_KEY
date: ADMIN_KAPTCHA_SESSION_DATE
直接通过http://127.0.0.1:8080/home/captcha访问即可
6.3 页面生成验证码
6.3.1 准备工作
创建项目,引入SpringMVC的依赖包,把前端页面放在项目中
6.3.2 约定前后端交互接口
需求分析
1)后端生成验证码并返回给前端
2)校验验证码受否正确
接口定义
1)生成验证码
请求:GET /admin/captcha
响应:图片内容
2)校验验证码是否正确
请求:POST /admin/check
响应:true
6.3.3 实现服务器端代码
引入依赖
java
<dependency>
<groupId>com.oopsguy.kaptcha</groupId>
<artifactId>kaptcha-spring-boot-starter</artifactId>
<version>1.0.0-beta-2</version>
</dependency>
通过配置文件创建验证码生成器
java
kaptcha:
items:
admin:
path: /admin/captcha
session:
key: ADMIN_KAPTCHA_SESSION_KEY
date: ADMIN_KAPTCHA_SESSION_DATE
验证码检验
java
@RequestMapping("/admin")
@RestController
public class CaptchaController {
private static final String SESSION_KEY = "ADMIN_KAPTCHA_SESSION_KEY";
private static final String SESSION_DATE ="ADMIN_KAPTCHA_SESSION_DATE";
private static final Long SESSION_TIME = 60 * 1000L;
@RequestMapping("/check")
public Boolean check(String captcha, HttpSession session) {
if (!StringUtils.hasLength(captcha)) {
return false;
}
//从Session中获取验证码
String saveCaptcha = (String)session.getAttribute(SESSION_KEY);
Date saveDate = (Date) session.getAttribute(SESSION_DATE);
//对比验证码
if (captcha.equals(saveCaptcha)) {
//对比日期
if (saveDate == null || System.currentTimeMillis() - saveDate.getTime() < SESSION_TIME) {
return true;
}
}
return false;
}
}
对比Session中存储的验证码是否和用户输入的一致,如果一致,并且试件在一分钟就认为成功
6.3.4 调整前端代码
javascript
$("#checkCaptcha").click(function () {
$.ajax({
url: "/admin/check",
type: "post",
data: {
captcha: $("#inputCaptcha").val()
},
success: function (result) {
if (result) {
location.href = "success.html";
} else {
alert("验证码错误");
}
}
});
});
6.3.5 运行测试
7 总结
1)properties是以key=value的形式配置的键值类型的配置文件,yml使用的是树形配置方式
2)读取配置文件内容,使⽤@Value注解,注解内使用" ${} "的格式读取
3)yml层级之间使用换行缩进的方式配置,key和value之间使⽤":"(英⽂冒号)加空格的方式设置,并且空格不可省略
4)yml可以很好的解决数据冗余的问题,但不适合复杂设置
5)yml和properties可以共存,但是项目中建议使用一种配置类型文件