赞
踩
配置文件通常是一个文本文件,其中包含了程序或系统的各种设置、选项和参数。比如C:\Users, C:\Windows 文件夹, 以及各种 .config, .xml 文件
配置文件主要是为了解决硬编码(代码写死)带来的问题, 把可能会发生改变的信息, 放在⼀个集中的地方, 当我们启动某个程序时, 应用程序从配置文件中读取数据, 并加载运行,它们允许开发人员将应用程序的配置信息从源代码中分离出来,从而提高代码的可维护性和灵活性。
SpringBoot 支持配置文件, 同时也并定义了配置文件的格式,很多项目或者框架的配置信息就放在配置文件中, 比如:
SpringBoot 内置了 Tomcat 服务器, 默认端口号是 8080, 但是用户电脑上 8080 端口号有可能就被其他应用程序占用了,此时我们就需要通过配置文件修改项目的启动端口号
SpringBoot 在创建项目时, 就已经帮我们创建了配置文件:
server.port=9090
显示 Tomcat 启动端口号为 9090
此时: http://127.0.0.1:808/login.html 就不能再访问了
Spring Boot 配置文件有以下三种格式:
如图所示:
当应用程序启动时, Spring Boot 会自动从 classpath 路径找到并加载 application.properties 和 application.yaml 或者 application.yml ⽂件,我们可以通过 spring.config.name 指定文件路径和名称
注意:
理论上讲 .properties 和 .yml 可以并存在于⼀个项目中,当 .properties 和 .yml 并存时,两个配置都会加载. 如果配置文件内容有冲突, 以 .properties 为主
虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置文件格式,这样可以更好的维护(降低故障率).
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 注解。@Value 注解使用 " ${} " 的格式读取
mykey.key1 = bite
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.RestController;
@RestController
public class PropertiesController {
@Value("${mykey.key1}")
private String key1;
@RequestMapping("/key")
public String key() {
return "读取到值:" + key1;
}
@Value(“${mykey.key1}”)注解的作用是告诉 Spring 框架在运行时去获取名为 mykey.key1 的属性值,并将其注入到 key1 变量中。
最终执行效果:
properties 配置是以 key-value 的形式配置的,如下图所示:
从上述配置 key 看出,properties 配置文件中会有很多的冗余的信息,比如这些:
想要解决这个问题,就要使用 yml 配置文件的格式化了.
yml 是树形结构的配置文件,它的基础语法是"key: value",key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略
因为第⼀项的配置为正确的,所以 key 也是高亮显示的
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: root
yml 和 properties 连接数据库的配置对比:
# 字符串 string.value: Hello # 布尔值,true或false boolean.value: true boolean.value1: false # 整数 int.value: 10 # 浮点数 float.value: 3.14159 # Null,~代表null null.value: ~ # 空字符串直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来 empty.value: ''
yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:
string:
hello: bite
@RestController
public class ReadYml {
@Value("${string.hello}")
private String hello;
@RequestMapping("/ymlKey")
public String key(){
return "读取到值:"+hello;
}
}
访问: http://127.0.0.1:8080/ymlKey
字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。
举个例子:
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
@RestController public class ReadYml { @Value("${string.str1}") private String str1; @Value("${string.str2}") private String str2; @Value("${string.str3}") private String str3; @RequestMapping("/yml") public String readYml(){ System.out.println(str1); System.out.println(str2); System.out.println(str3); return "yml"; } }
以上程序的执行结果如下图所示:
从上述结果可以看出:
注意:此处的转义理解起来会有些拗口, \n 本意表示的是换行
我们还可以在 yml 中配置对象
student:
id: 1
name: Java
age: 18
或者是使用行内写法(与上面写法的作用是一样的):
student: {id: 1,name: Java,age: 18}
这个时候就不能用 @Value 来读取配置中的对象了,此时要使用另⼀个注解 @ConfigurationProperties 来读取
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
prefix = “student” 意味着这个注解将会查找 “student” 的配置项,并将它们映射到被注解的类的属性上。
配置文件中的属性是 student.id、student.name 和 student.age。使用了 @ConfigurationProperties(prefix = “student”) 注解之后,Spring Boot 会根据名字自动将这些属性值注入到 Student 类的对应属性 id、name 和 age 中。
配置文件也可以配置 list 集合,如下所示:
dbtypes:
name:
- mysql
- sqlserver
- db2
集合的读取和对象⼀样,也是使用 @ConfigurationProperties 来读取的
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
配置文件也可以配置 map,如下所示:
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
或者是使用行内写法
maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}
Map 的读取和对象⼀样,也是使用 @ConfigurationProperties 来读取的
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
优点:
缺点:
举个例子:
keycloak.realm = demo
keycloak.resource = fm-cache-cloud
keycloak.credentials.secret = d4589683-Oce7-4982-bcd3
keycloak.security[0].authRoles[0]= user
keycloak.security[0].collections[0].name = ssologinurl
keycloak.security[0].collections[0].patterns[0] = /login/*
keycloak:
realm: demo
resource: fm-cache-cloud
credentials:
secret: d4589683-Oce7-4982-bcd3
security:
- authRoles:
- user
collections:
- name: ssologinurl
patterns:
- /login/*
下面我们来做一个验证码案例
验证码的实现方式很多, 网上也有比较多的插件或者工具包可以使用, 咱们选择使用 Google 的开源项目 Kaptcha 来实现.
Kaptcha 是 Google 的⼀个⾼度可配置的实用验证码生成工具,网上有很多人甚至公司基于 Google 的 kaptcha 进行了⼆次开发. 我们直接选择⼀个适配 SpringBoot 的开源项目
由于作者的文档写的不是很全, 下⾯简单介绍下插件的使用
验证码可以客户端生成, 也可以服务器生成.,对于普通的字符验证码, 后端通常分两部分.
kaptcha 插件选择把验证码存储在 Session 里
<dependency>
<groupId>com.oopsguy.kaptcha</groupId>
<artifactId>kaptcha-spring-boot-starter</artifactId>
<version>1.0.0-beta-2</version>
</dependency>
该插件提供了两种方式生成验证码:
我们采用配置文件的形式来生成验证码
Kaptcha 详细配置:
配置项 | 配置说明 | 默认值 |
---|---|---|
kaptcha.border | 图片边框,合法值:yes , no | yes |
kaptcha.border.color | 边框颜色,合法值: r,g,b 或者 white,black,blue. | black |
kaptcha.image.width | 图片宽 | 200 |
kaptcha.image.height | 图片高 | 50 |
kaptcha.producer.impl | 图片实现类 | com.google.code.kaptcha.impl.DefaultKaptcha |
kaptcha.textproducer.impl | 文本实现类 | com.google.code.kaptcha.text.impl.DefaultTextCreator |
kaptcha.textproducer.char.string | 文本集合,验证码值从此集合中获取 | abcde2345678gfynmnpwx |
kaptcha.textproducer.char.length | 验证码长度 | 5 |
kaptcha.textproducer.font.names | 字体 | Arial, Courier |
kaptcha.textproducer.font.size | 字体大小 | 40px |
kaptcha.textproducer.font.color | 字体颜色,合法值: r,g,b 或者 white,black,blue. | black |
kaptcha.textproducer.char.space | 文字间隔 | 2 |
kaptcha.noise.impl | 干扰实现类 | com.google.code.kaptcha.impl.DefaultNoise |
kaptcha.noise.color | 干扰颜色,合法值: r,g,b 或者 white,black,blue. | black |
kaptcha.obscurificator.impl | 图片样式 水纹,鱼眼,阴影 | 水纹 |
kaptcha.background.impl | 背景实现类 | com.google.code.kaptcha.impl.DefaultBackground |
kaptcha.background.clear.from | 背景颜色渐变,开始颜色 | light grey |
kaptcha.background.clear.to | 背景颜色渐变,结束颜色 | white |
kaptcha.word.impl | 文字渲染器 | com.google.code.kaptcha.text.impl.DefaultWordRenderer |
kaptcha.session.key | session key | KAPTCHA_SESSION_KEY |
kaptcha.session.date | session date | KAPTCHA_SESSION_DATE |
我们可以使用 kaptcha.items 配置多个验证码生成器,kaptcha.items 是⼀个 Map, key 为验证码生成器名称, value 为验证码生成器的配置
kaptcha:
items:
# home captcha
home:
path: /homeaptcha
session:
key: HOME_KAPTCHA_KEY
date: HOME_KAPTCHA_SESSION_DATE
# admin captcha
admin:
path: /admin/captcha
session:
key: ADMIN_KAPTCHA_SESSION_KEY
date: ADMIN_KAPTCHA_SESSION_DATE
配置说明:
配置后, 可以直接访问 http://XXXX:port/home/captcha 即可生成验证码
界面如下图所示:
创建项目, 引入 Spring MVC 的依赖包, 把前端页面放在项目中
需求分析:后端需要提供两个服务:
接口定义:
请求:
GET /admin/captcha
响应: 图片内容
浏览器给服务器发送⼀个 GET /admin/captcha 这样的请求, 服务器就会返回⼀个图片, 浏览器会将图片显示在页面上
请求: /admin/check
POST /admin/check
captcha=xn8d
captcha:用户输入的验证码
响应:根据用户输⼊的验证码, 校验验证码是否正确. true: 验证成功. false: 验证失败.
true
<dependency>
<groupId>com.oopsguy.kaptcha</groupId>
<artifactId>kaptcha-spring-boot-starter</artifactId>
<version>1.0.0-beta-2</version>
</dependency>
kaptcha: border: enabled: true image: height: 50 width: 160 text-producer: character: length: 4 font: color: blue items: home: path: /admin/captcha session: key: KAPTCHA_SESSION_KEY date: KAPTCHA_SESSION_DATE
import com.google.code.kaptcha.Constants; 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; @RestController public class KaptchaController { private final static long VALID_MILLIS_TIME = 60 * 1000; @RequestMapping("/check") public boolean checkHomeCaptcha(String captcha, HttpSession session) { if (!StringUtils.hasLength(captcha)) { return false; } String savedCaptcha = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY); Date sessionDate = (Date) session.getAttribute(Constants.KAPTCHA_SESSION_DATE); if (captcha.equalsIgnoreCase(savedCaptcha)) { if (sessionDate == null || System.currentTimeMillis() - sessionDate.getTime() < VALID_MILLIS_TIME) { return true; } return false; } return false; } }
$("#checkCaptcha").click(function () { $.ajax({ url: "/check", type: "post", data: { captcha: $("#inputCaptcha").val() }, success: function (result) { if (result) { location.href = "success.html"; } else { alert("验证码错误"); $("#inputCaptcha").val(""); } } }); });
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。