一.表单验证
1.为要校验的对象添加对应的校验注解
-
使用
@Min(value=18,message="未成年少女金之入内")
标记对应类中的属性。注解表示age最小值为18,错误提示为:未成年少女禁止入内 -
Girl类实例代码
package com.study.demo.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.validation.constraints.Min; @Entity public class Girl{ @Id @GeneratedValue private Integer id; private String cupSize; //表示age最小值为18,错误提示为:未成年少女禁止入内 @Min(value=18,message = "未成年少女禁止入内") private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getCupSize() { return cupSize; } public void setCupSize(String cupSize) { this.cupSize = cupSize; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Girl{" + "id=" + id + ", cupSize='" + cupSize + '\'' + ", age=" + age + '}'; } }
2.在对应方法的入参中使用@Vaild注解标记该对应需要被验证,并通过BindingResult类型参数接受验证结果
-
结果对象的hasErrors()方法用于判断是否发生错误
-
结果对象的getFieldError().getDefaultMessage()方法获得对应的错误信息
-
对应方法的实例代码
//新增女生 @PostMapping(value="/girls") public Girl girlAdd(@Valid Girl girl, BindingResult bindingResult){ //@Valid注解表示要验证的对象为girl,验证结果会返回到参数bindingResult对象中 //通过对象的hasErrors()方法获得是否发生错误 if(bindingResult.hasErrors()){ //并通过getFieldError().getDefaultMessage()方法获得对应的错误信息 System.out.println(bindingResult.getFieldError().getDefaultMessage()); return null; } girl.setCupSize(girl.getCupSize()); girl.setAge(girl.getAge()); return girlRepository.save(girl);//方法返回的就是添加的对象 }
-
当发送post请求时,若cupSize属性超过18则会在控制台输出“未成年少女禁止入内”,并返回null值
二.AOP统一处理请求日志
1.什么是AOP?
- AOP是一种编程范式,与语言无关,是一种程序设计思想
- 面向切面(AOP)Aspect Oriented Programming:将通用逻辑从业务逻辑中分离出来
- 面向对象(OOP)Object Oriented Programming
- 面向过程(POP)Procedure Oriented Programming
2.网络请求的生命周期
收到HttpRequest请求
—> 记录请求
—> 处理网络请求
—> 生成HttpResponse
—> 记录回复
3.操作数据库的生命周期
收到数据库操作请求
—> 记录请求
—> 增删改查
—> 生成处理结果
—> 记录回复
4.记录每一个http请求
-
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
-
建立处理文件:aspect/HttpAspect.java
import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect//标记类为Aspect类 @Component//引入到Spring容器中 public class HttpAspect { //org.slf4j.Logger是Spring自带的日志记录框架 private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); @Pointcut("execution(public * com.study.demo.controller.HelloController.girlList(..))")//.girlList(..)表示girlList方法不管是任何参数都会被拦截;.*(..)则表示该类的所有方法都会被拦截 public void log(){ } //定义在http请求到方法之前将内容记录下来 @Before("log()") public void doBefore(){ logger.info("记录日志");//使用Logger的方法记录日志 } //定义在执行完方法后调用 @After("log()") public void doAfter(){ logger.info("执行方法之后的调用..."); } }
-
访问接口时的显示内容(可以看出使用
logger.info()
方法打印的内容带有时间等相关信息)2018-09-19 12:58:55.250 INFO 44464 --- [nio-8082-exec-2] com.study.demo.aspect.HttpAspect : 记录日志 2018-09-19 12:58:55.253 INFO 44464 --- [nio-8082-exec-2] c.study.demo.controller.HelloController : 执行到GirlList 2018-09-19 12:58:55.280 INFO 44464 --- [nio-8082-exec-2] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory Hibernate: select girl0_.id as id1_0_, girl0_.age as age2_0_, girl0_.cup_size as cup_size3_0_ from girl girl0_ 2018-09-19 12:58:55.364 INFO 44464 --- [nio-8082-exec-2] com.study.demo.aspect.HttpAspect : 执行方法之后的调用...
-
调整@Before注解的方法执行指定内容
@Before("log()") public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(</