博主主页: 码农派大星.
** 数据结构专栏**:Java数据结构
** 数据库专栏:**MySQL数据库
**JavaEE专栏:**JavaEE
软件测试专栏:软件测试
关注博主带你了解更多知识
1. SpringBoot配置⽂件
配置⽂件主要是为了解决硬编码带来的问题,把可能会发⽣改变的信息,放在⼀个集中的地⽅,当我们启动某个程序时,应⽤程序从配置⽂件中读取数据,并加载运⾏.
在 Spring Boot 应用中,配置文件是用来定义应用配置的重要部分,包括数据库连接信息、服务地址、第三方 API 密钥等。Spring Boot 支持多种类型的配置文件,最常用的是 yml 和 properties 文件
1.1 很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:
• 项⽬的启动端⼝
• 数据库的连接信息(包含⽤⼾名和密码的设置)
• 第三⽅系统的调⽤密钥等信息 • ⽤于发现和定位问题的普通⽇志和异常⽇志等
2. 配置文件快速入手
SpringBoot内置了Tomcat服务器,默认端⼝号是8080, 但是⽤⼾电脑上8080端⼝号有可能就被其他 应⽤程序占⽤了, 所以SpringBoot需要⽀持让⽤⼾⾃定义端⼝号
我们可以通过配置⽂件来修改服务的端⼝号:
修改 application.properties ⽂件:
server.port=10086
显⽰Tomcat启动端⼝号为10086
3. 配置⽂件的格式
Spring Boot 配置⽂件有以下三种:
application.properties
application.yml
application.yaml
yml为yaml的简写,实际开发中出现频率最⾼. 使⽤ yaml和yml的使⽤⽅式⼀样
3.1 说明
1 .properties 和 .yml 可以并存在于⼀个项⽬中,但当两个并存时,两个配置都会加载.如果配置⽂件内容有冲突,则以 .properties 优先级更⾼.
2 . 虽然理论上来讲 .properties 可以和 .properties 和 .yml .properties 为主,也就是 .yml 共存,但实际的业务当中,我们通常会采取⼀种 统⼀的配置⽂件格式,这样可以更好的维护
4. properties 配置⽂件说明
properties 配置⽂件是最早期的配置⽂件格式,也是创建SpringBoot项⽬默认的配置⽂件
4.1 properties 基本语法
properties 是以键值的形式配置的,key和value之间是以"="连接的
spring.application.name=config-demo
font.size=14px
4.2 读取配置⽂件
在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解使⽤" ${} "的格式读取
@RequestMapping("/prop")
@RestController
public class PropertiesController {
@Value("${font.size}")
private String fontSize;
@RequestMapping("/readValue")
public String readValue(){
return "fontSize:" + fontSize;
}
}
最终执行效果:
5. yml配置⽂件说明
5.1 yml基本语法
yml是树形结构的配置⽂件,它的基础语法是"key:value".
key和value之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略
mykey: value1
5.2 yml配置读取
5.2.1配置对象
student:
id: 1
name: Java
age: 18
如果配置的是一个对象,那么就不能使用@Value来读取,应该使用@ConfigurationProperties
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
5.2.2配置集合
//配置文件
dbtypes:
name:
- mysql
- sqlserver
- db2
//其他类
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
5.2.3配置Map
//配置文件
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
//其他类
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
5.3 注意事项:value值加单双引号
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
字符串默认不⽤加上单引号或者双引号。
单引号会转义特殊字符,使其失去特殊功能,始终是⼀个普通的字符串.
双引号不会转义字符串⾥⾯的特殊字符,特殊字符会表⽰本⾝的含义
5.4 yml优缺点
优点:
可读性⾼,写法简单, 易于理解
⽀持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态.
⽀持更多的编程语⾔,不⽌是Java中可以使⽤,在Golang,Python,Ruby,JavaScript中也可以使⽤
缺点:
1.不适合写复杂的配置⽂件
- 对格式有较强的要求
6.验证码案例
6.1 需求
⻚⾯⽣成验证码
输⼊验证码,点击提交,验证⽤⼾输⼊验证码是否正确,正确则进⾏⻚⾯跳转
6.2 约定前后端交互接⼝
需求分析
后端需要提供两个服务
⽣成验证码,并返回验证码
校验验证码是否正确:校验验证码是否正确
接⼝定义
请求:
- ⽣成验证码
请求URL: /captcha/get
浏览器给服务器发送⼀个/captcha/get这样的请求,服务器返回⼀个图⽚,浏览器显⽰在⻚⾯上
- 校验验证码是否正确
请求:/captcha/check
captcha: ⽤⼾输⼊的验证码
响应:
true
6.3 借助Hutool⼯具
验证码的实现,使⽤Hutool提供的⼩⼯具来实现
引⼊依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
<version>5.8.22</version>
</dependency>
6.4 实现服务器端代码
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ICaptcha;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.lang.Console;
import com.VerificationCode.demo.model.CaptchaProperties;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RequestMapping("/captcha")
@RestController
public class VerificationController {
@Autowired
private CaptchaProperties captchaProperties;
private long VALID_TIME = 60*1000;
@RequestMapping("/get")
public void getCaptcha(HttpSession session,HttpServletResponse response) throws IOException {
ICaptcha captcha = CaptchaUtil.createLineCaptcha(
captchaProperties.getWidth(), captchaProperties.getHeight());
captcha.write(response.getOutputStream());
//禁止缓存
response.setHeader("Prama","No-cache");
//设置返回格式
response.setContentType(("/image.jpeg"));
//打印验证码
System.out.println(captcha.getCode());
//存储session
session.setAttribute(captchaProperties.getSession().getCode(),captcha.getCode());
session.setAttribute(captchaProperties.getSession().getDate(),System.currentTimeMillis());
response.getOutputStream().close();
//Servlet的OutputStream记得自行关闭哦!
}
@RequestMapping("/check")
public Boolean check(String captchaCode,HttpSession session){
//参数校验
//判断用户输入是否和session一致
//判断是否在有效期内
if(!StringUtils.hasLength(captchaCode)){
return false;
}
String sessionCode = (String)session.getAttribute(captchaProperties.getSession().getCode());
Long sessionDate = (Long)session.getAttribute(captchaProperties.getSession().getDate());
if(captchaCode.equals(sessionCode) && sessionDate != null && System.currentTimeMillis()-sessionDate
< VALID_TIME ){
return true;
}
return false;
}
}
把配置项挪到配置⽂件中
captcha:
width: 100
height: 40
session:
code: SESSION_CODE
date: SESSION_DATE
把⽣成的验证码存储在Session中,校验时使⽤
验证码配置项对应的Java对象
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "captcha")
@Data
public class CaptchaProperties {
private Integer width;
private Integer height;
private Session session;
@Data
public static class Session{
private String code;
private String date;
}
}
6.5 调整前端代码
<script>
$("#verificationCodeImg").click(function(){
$(this).hide().attr('src', '/captcha/get?dt=' + new Date().getTime()).fadeIn();
});
$("#checkCaptcha").click(function () {
$.ajax({
type:"post",
url: "/captcha/check",
data:{
captchaCode: $("#inputCaptcha").val()
},
success:function(result){
if(result){
location.href = "success.html";
}else{
alert("验证错误,码有问题!")
}
}
});
});
</script>
6.6 验证结果
7. 总结
properties 是以key=value的形式配置的键值类型的配置⽂件,yml使⽤的是树形配置⽅式.
读取配置⽂件内容,使⽤ @Value 注解,注解内使⽤" ${} "的格式读取.
yml层级之间使⽤换⾏缩进的⽅式配置,key和value之间使⽤":"加空格的⽅式设置,并且空格不可省略.
properties 为早期并且默认的配置⽂件格式,其配置存在⼀定的冗余数据,使⽤yml可以很好的解决 数据冗余的问题,但不适合复杂配置.
yml可以和properties共存,但⼀个项⽬中建议使⽤⼀种配置类型⽂件
版权归原作者 码农派大星. 所有, 如有侵权,请联系我们删除。