配置文件主要是为了解决硬编码带来的问题, 把可能会发生改变的信息, 放在⼀个集中的地方,当我们启动某个程序时, 应用程序从配置文件中读取数据, 并加载运行
硬编码是将数据直接嵌入到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死"
SpringBoot支持并定义了配置文件的格式,也在另⼀个层面达到了规范其他框架集成到SpringBoot的目的
很多项目或者框架的配置信息也放在配置文件中,比如:
Spring Boot 支持三种格式:properties、yml、yaml,但是只支持下面三种配置文件:
Spring Boot 配置文件有以下三种:
yml 为yaml的简写, 实际开发中出现频率最高,yaml 和yml 的使用方式⼀样。
- 当应用程序启动时, Spring Boot会自动从classpath路径找到并加载application.properties 和 application.yaml 或者 application.yml 文件
- 也可以通过spring.config.name指定文件路径和名称
properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项目默认的配置文件
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
@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;
}
}
是以 key-value 的形式配置的,会有很多冗杂的信息。yml格式则很好地避免了这个问题。
yml 是树形结构的配置文件,它的基础语法是"key: value"。
key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略
1. 使用yml连接数据库
使用 @Value 来读取
# 使用yml连接数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: 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: 1
name: Java
age: 18
# 第二种写法(行内写法)
student: {id: 1,name: Java,age: 18}
@RestController
public class StudentController {
@Autowired
private 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: 1
name: Java
age: 18
4. 配置集合
用 @ConfigurationProperties 来读取
dbtypes:
name:
- mysql
- sqlserver
- db2
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
@RestController
public class ReadYml2 {
@Autowired
private ListConfig listConfig;
@RequestMapping("/readList")
public String readList(){
return listConfig.toString();
}
}
5. 配置Map
用 @ConfigurationProperties 来读取
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
@RestController
public class ReadYml2 {
@Autowired
private MapConfig mapConfig;
@RequestMapping("/readMap")
public String readStudent(){
return mapConfig.toString();
}
}
(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";
//验证码的有效时间: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;
}
}
前端代码
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>