9.3 校验相关注解
注解 | 作用 |
@NotNull | 判断包装类是否为null |
@NotBlank | 判断字符串是否为null或者是空串(去掉首尾空格) |
@NotEmpty | 判断集合是否为空(在判断泛型是基本数据类型的时候还需要加@RequestParam) |
@Length | 判断字符的长度(最大或者最小) |
@Min | 判断数值最小值 |
@Max | 判断数值最大值 |
判断邮箱是否合法 |
1、控制器
package com.zj.controller; import org.hibernate.validator.constraints.Length; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.validation.constraints.*; import java.util.List; @Controller @Validated //该控制器开启参数校验 public class TestController { @RequestMapping("/test1") @ResponseBody //在参数校验,表示该参数不为空。当参数为空时会报异常 public String test1(@NotBlank(message = "用户名不能为空") @Length(min = 1,max = 5) String name, @NotNull @Min(1) @Max(100) Integer age, @NotEmpty @RequestParam List<String> address, @NotBlank @Email String email){ return "请求成功"; } }
2、访问
9.3 校验对象类型
SpringBoot也可以校验对象参数中的每个属性,用法如下:
1、添加实体类
public class Student { @NotNull(message = "id不能为空") private Integer id; @NotBlank(message = "姓名不能为空") private String name; // 省略getter/setter/tostring }
2、控制器
@RequestMapping("/test2") @ResponseBody // 校验的对象参数前添加@Validated,并将异常信息封装到BindingResult对象中 public String t3(@Validated Student student, BindingResult result) { // 判断是否有参数异常 if (result.hasErrors()) { // 所有参数异常 List<ObjectError> list = result.getAllErrors(); // 遍历参数异常,输出异常信息 for (ObjectError err : list) { FieldError fieldError = (FieldError) err; System.out.println(fieldError.getDefaultMessage()); } return "参数异常"; } System.out.println(student); return "请求成功!"; }
3、访问
十、SpringBoot指标监控
10.1 添加Actuator功能
Spring Boot Actuator可以帮助程序员监控和管理SpringBoot应用,比如健康检查、内存使用情况统计、线程使用情况统计等。我们在SpringBoot项目中添加Actuator功能,即可使用Actuator监控项目,用法如下:
1、在被监控的项目中添加Actuator起步依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2、编写配置文件
#开启所有监控端点 management.endpoints.web.exposure.include=*
3、访问项目:http://localhost:8080/actuator
通过URL可以调用actuator的功能:
URL | 查看的数据 |
/env | 环境属性 |
/health | 健康检查 |
/mappings | 显示所有的@RequestMapping路径 |
/loggers | 日志 |
/info | 定制信息 |
/metrics | 查看内存、CPU核心等系统参数 |
/trace | 用户请求信息 |
例如查询健康数据,访问http://localhost:8080/actuator/health
10.2 创建SpringBootAdmin服务端项目
Actuator使用JSON格式展示了大量指标数据,不利于我们查看,我们可以使用可视化工具Spring Boot Admin查看actuator生成指标数据。Spring Boot Admin是一个独立的项目,我们需要创建并运行该项目。
1、创建SpringBoot项目,添加SpringMVC和Spring Boot Admin服务端起步依赖
2、修改配置文件
# 端口号 server.port=8081 #日志格式 logging.pattern.console=%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n
3、修改启动类
@SpringBootApplication @EnableAdminServer //开启Spring Boot Admin服务端 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
10.3 连接SpringBootAdmin项目
在被监控的项目中连接Spring Boot Admin项目,才能使用Spring Boot Admin查看指标数据。
1、被监控项目添加Spring Boot Admin客户端起步依赖
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.6.0</version> </dependency>
2、修改配置文件
#连接服务端 spring.boot.admin.client.url=http://localhost:8081
此时Spring Boot Admin即可连接被监控的项目
十一、SpringBoot日志管理
11.1 logback日志配置
SpringBoot默认使用Logback组件作为日志管理。Logback是log4j创始人设计的一个开源日志组件。在SpringBoot项目中我们不需要额外的添加Logback的依赖,因为在spring-boot-parent
中已经包含了Logback的依赖。
1、在/resources
下添加Logback配置文件logback.xml
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!--定义日志文件的存储地址--> <property name="LOG_HOME" value="${catalina.base}/logs/"/> <!-- 控制台输出 --> <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender"> <!-- 日志输出编码 --> <layout class="ch.qos.logback.classic.PatternLayout"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </layout> </appender> <!-- 按照每天生成日志文件 --> <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/server.%d{yy99-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <!--格式化输出:%d表示时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </layout> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 日志输出级别 --> <root level="info"> <appender-ref ref="Stdout"/> <appender-ref ref="RollingFile"/> </root> </configuration>
注:Logback配置文件名为logback-test.xml或logback.xml,如果classpath下没有这两个文件,LogBack会自动进行最小化配置。
2、在代码中打印日志
package com.zj.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class LogController { private final static Logger logger = LoggerFactory.getLogger(LogController.class); @RequestMapping("/log") @ResponseBody public String showLogMessage(){ //每次访问在控制台、日志文件中输出日志 logger.info("记录日志:logMessage方法执行"); return "hello Logback"; } }
3、访问
如果日志过多,可以屏蔽一些包的日志,在配置文件中配置
#屏蔽org包中的日志输出
logging.level.org=off
11.2 log4j2安全漏洞
补充:Log4j2安全漏洞
在2021年12月,Log4j2爆出了极其严重的安全漏洞,攻击者可以让记录的日志包含指定字符串,从而执行任意程序。很多大型网站,如百度等都是此次Log4j漏洞的受害者,很多互联网企业连夜做了应急措施。
Log4j2.0到2.14.1全部存在此漏洞,危害范围极其广泛,Log4j2.15.0-rc1中修复了这个 bug。
因Log4j2漏洞的反复无常,导致某些公司已经切换到Logback来记录日志,但在Log4j2漏洞爆出后,Logback也爆出漏洞:在Logback1.2.7及之前的版本中,具有编辑配置文件权限的攻击者可以制作恶意配置,允许从LDAP服务器加载、执行任意代码。
解决方案为将Logback升级到安全版本:
Logback1.2.9+
SpringBoot2.6.2以上的Logback版本已经升到了1.2.9,Log4j2的版本也升到了2.17.0,所以我们使用SpringBoot2.6.2以上版本无需担心Log4j2和Logback安全漏洞。
十二、SpringBoot项目部署
12.1 项目打包
SpringBoot项目是依赖于Maven构建的,但打包时如果只依赖Maven打包工具则会打包不完整,我们还需要在SpringBoot项目中引入SpringBoot打包插件 ,有些版本是自动带着该插件的。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
如果加上这个插件仍无法打包的话再加上下面的这个插件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <!--修改版本--> <version>3.1.0</version> </plugin>
打包好的jar在target目录下:
运行jar包:
- 进入jar包所在目录,使用cmd打开命令行窗口
- 输入命令:java -jar jar包名
12.2 多环境配置
在真实开发中,在不同环境下运行项目往往会进行不同的配置,比如开发环境使用的是开发数据库,测试环境使用的是测试数据库,生产环境使用的是生产数据库。SpringBoot支持不同环境下使用不同的配置文件,用法如下:
配置文件名:
application-环境名.properties/yml
1、application-dev.properties/yml 开发环境配置文件
# 开发环境端口号为8080 server: port: 8080
2、application-test.properties/yml 测试环境配置文件
# 测试环境端口号为8081 server: port: 8081
3、application-prod.properties/yml 生产环境配置文件
# 生产环境端口号为80 server: port: 80
运行jar包时选择环境:
java -jar jar包名 --spring.profiles.active=环境名