首页 > 其他分享 >SpringBoot如何优雅的进行参数校验(一)

SpringBoot如何优雅的进行参数校验(一)

时间:2024-04-23 14:45:32浏览次数:15  
标签:return SpringBoot 适用范围 校验 优雅 注释 参数 必须

SpringBoot如何优雅的进行参数校验

一.为什么要进行参数校验

在日常的开发过程中,我们常常需要对传入的参数进行校验,比如在web前后端分离项目中,参数校验有两个方面:

  • 前端进行参数校验

  • 后端进行参数校验

那这两种有什么区别呢?只完成一个可不可以呢?

答案是不可以的!

  1. 前端校验

    前端校验主要是针对用户输入时,一些基础的错误进行提示,提升用户体验。比如:必填的选项,邮箱,网址的规则,如果前端校验不通过的话就不需要将请求转到后端。

    但是:对于某些不走寻常路的用户,前端校验其实形同虚设。

  2. 后端校验

    后端校验是针对整个系统的业务逻辑进行校验,包含用户的权限,请求的参数等,校验的范围要大于前端.如果不做后端的校验会怎么样呢?比如前端向后端提交了一个只包含邮箱的请求,然后一些心术不正的人将该请求拷贝,改变参数为任意一段字符,然后重新发送请求,那么请求仍然能被处理,数据库就会有一条脏数据,借助此操作,可以完成一些对系统危害性更大的操作.

    前端校验是辅助,后端校验是核心。后端校验必不可少。

二.后端参数校验方式

传统的参数校验一般采用大量的if else代码对参数进行一个一个的校验

传统的参数校验方式:

public String checkUserDTO(UserDTO user) {

     if (StringUtils.isEmpty(user.getName())) {
         return "用户名不能为空";
     }
     if(StringUtils.isEmpty(user.getEmail())) {
     	return "邮箱不能为空";
     }
     if(StringUtils.isEmpty(user.getAccount())) {
     	return "账号不能为空";
     }
    
     if (user.getAccount().length() < 6 || user.getAccount().length() > 11) {
         return "账号长度必须是6-11个字符";
     }
     if (!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", user.getEmail())) {
         return "邮箱格式不正确";
     }
     return "success";
 }

这样的方式的话,如果参数多了那光参数校验就是一大堆,给人的感觉就是:不优雅,不专业,代码可读性也很差.

那么怎么能简单快捷的进行参数校验呢?

其实在SpringBoot项目中我们可以引入spring-boot-starter-validation来简单的进行参数校验.

三.spring-validation使用

引入依赖

粘贴请去除其中多余空格

< !--参数校验 -- >
 < dependency >
         < groupId>org.springframework.boot < /groupId>
         < artifactId>spring-boot-starter-validation< /artifactId>
   < /dependency>

参数注解列表

spring-validation是以注解的方式完成参数的校验的,而根据springboot官网的介绍,只要有JSR-303实现,例如Hibernate验证器,那么就能进行参数的校验.

这里列一下常用的注解:

  • @Null

    • 说明:被注释的元素必须为 null

    • 适用范围:Object

  • @NotNull

    • 说明:被注释的元素必须不为 null

    • 适用范围:Object

  • @AssertTrue

    • 说明:被注释的元素必须为 true

    • 适用范围:booleanBoolean

  • @AssertFalse

    • 说明:被注释的元素必须为 false

    • 适用范围:booleanBoolean

  • @Min(value)

    • 说明:被注释的元素必须是一个数字,其值必须大于等于指定的最小值

    • 适用范围:BigDecimalBigIntegerbyteByteshortShortintIntegerlongLong

  • @Max(value)

    • 说明:被注释的元素必须是一个数字,其值必须小于等于指定的最大值

    • 适用范围:BigDecimalBigIntegerbyteByteshortShortintIntegerlongLong

  • @DecimalMin(value)

    • 说明:被注释的元素必须是一个数字,其值必须大于等于指定的最小值

    • 适用范围:BigDecimalBigIntegerCharSequencebyteByteshortShortintIntegerlongLong

  • @DecimalMax(value)

    • 说明:被注释的元素必须是一个数字,其值必须小于等于指定的最大值

    • 适用范围:BigDecimalBigIntegerCharSequencebyteByteshortShortintIntegerlongLong

  • @Size(max, min)

    • 说明:被注释的元素的大小必须在指定的范围内

    • 适用范围:CharSequenceCollectionMapArray

  • @Digits (integer, fraction)

    • 说明:被注释的元素必须是一个数字,其值必须在可接受的范围内

    • 适用范围:BigDecimalBigIntegerCharSequencebyte Byteshort Shortint Integerlong Long

  • @Past

    • 说明:被注释的元素必须是一个过去的日期

    • 适用范围:DateCalendarInstantLocalDateLocalDateTimeLocalTimeMonthDayOffsetDateTimeOffsetTimeYearYearMonthZonedDateTimeHijrahDateJapaneseDateMinguoDateThaiBuddhistDate

  • @Future

    • 说明:被注释的元素必须是一个将来的日期

    • 适用范围:DateCalendarInstantLocalDateLocalDateTimeLocalTimeMonthDayOffsetDateTimeOffsetTimeYearYearMonthZonedDateTimeHijrahDateJapaneseDateMinguoDateThaiBuddhistDate

  • @Pattern(value)

    • 说明:被注释的元素必须符合指定的正则表达式

    • 适用范围:CharSequencenull

  • @Email

    • 说明:被注释的元素必须是电子邮箱地址

    • 适用范围:CharSequence

  • @Length

    • 说明:被注释的字符串的大小必须在指定的范围内

  • @NotEmpty

    • 说明:被注释的字符串的必须非空

  • @Range

    • 说明:被注释的元素必须在合适的范围内

具体使用

对于web服务来说,为防止非法参数对业务造成影响,在Controller层一定要做参数校验的!大部分情况下,请求参数分为如下两种形式:

  1. POSTPUT请求,使用requestBody传递参数;

  2. GET请求,使用requestParam/PathVariable传递参数。

下面我们简单介绍下requestBodyrequestParam/PathVariable的参数校验

requestBody参数校验

POSTPUT请求一般会使用requestBody传递参数,这种情况下,后端使用DTO对象进行接收。只要给DTO对象加上@Validated注解就能实现自动参数校验

requestBody参数校验需要两个步骤:

  • DTO字段上声明约束注解

    public class UserDTO {
    
        private Long Id;
    
        @NotNull
        @Length(min = 2, max = 10)
        private String name;
    
        @NotNull
        @Length(min = 6, max = 20)
        private String account;
    
        @NotNull
        @Email
        private String email;
    }
    
  • 方法参数上声明校验注解

public Result addUser(@RequestBody @Validated UserDTO userDTO) {
    // 校验通过,才会执行业务逻辑处理
    return Result.ok();
}

requestParam/PathVariable参数校验

GET请求一般会使用requestParam/PathVariable传参

将一个个参数平铺到方法入参中。在这种情况下,必须在Controller类上标注@Validated注解,并在入参上声明约束注解(如@Min等)

@Validated
@RestController
public class UserController {
    // 路径变量
    @GetMapping("{userId}")
    public Result detail(@PathVariable("userId") @Min(10000000000000000L) Long userId) {
        // 校验通过,才会执行业务逻辑处理
        UserDTO userDTO = new UserDTO();
        userDTO.setId(userId);
        return Bizmessage.success(userDTO);
    }

    // 查询参数
    @GetMapping("getByAccount")
    public BizMessage getByAccount(@Length(min = 6, max = 11) @NotNull String  account) {
        // 校验通过,才会执行业务逻辑处理
        UserDTO userDTO = new UserDTO();
        userDTO.setAccount(account);
        return Bizmessage.success(userDTO);
    }
}

如果校验失败,则会抛出异常,通常会有统一异常处理

Hibernate Validator的功能是非常强大的,它还支持分组校验,嵌套校验,集合校验,自定义校验等多种校验方式,功能非常强大.

标签:return,SpringBoot,适用范围,校验,优雅,注释,参数,必须
From: https://www.cnblogs.com/Jcloud/p/18152846

相关文章

  • SpringBoot的Cookie sameSite之坑
    https://blog.csdn.net/weixin_38296425/article/details/111941318 CSDN上很多文章给出了解决CookiesameSite坑跨域之坑的解决办法,但是都忽略了一个问题,没有给出相关的依赖,我也是费了不少劲终于找到了解决办法,在这里记录下来。例如下面的代码:@ConfigurationpublicclassT......
  • SpringBoot3使用自带日志组件Logback
    参考:https://blog.csdn.net/AIJXB/article/details/128602818pom.xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency>application.yaml配置l......
  • sh004基于springboot的MES生产制造执行系统【带LW文档】
    介绍基于springboot的MES生产制造执行系统管理员功能主要包括:生成计划管理、产品信息管理、销售订单管理、客户信息管理、物料信息管理、工业线路管理工序信息管理、员工管理、部门管理、个人中心等功能。员工功能结构图。其中员工查看工序信息,查看工艺线路,查看物料信息,查看产......
  • sh005基于springboot的景区订票系统【带LW文档】
    介绍基于springboot的景区订票系统管理员功能主要包括:个人中心、景点类型管理、公告类型管理、景点信息管理、公告信息管理、论坛管理、用户信息管理、轮播图管理、景点留言管理、景点收藏管理、景点预定管理等功能。由于本系统的功能模块设计比较全面,所以使得整个基于springbo......
  • flutter 结合 springBoot 完成登录 注册 功能
    后端接口 前端调用接口代码import'package:dio/dio.dart';import'package:flutter/material.dart';import'../page/login.dart';//注册功能Future<void>register(BuildContextcontext,Stringusername,Stringpassword,......
  • sh002基于springboot的网上团购系统
    介绍网上团购系统管理员功能主要包括:个人中心、用户管理、商品列表管理、团购商品管理、订单管理、系统管理等功能由于本系统的功能模块设计比较全面,所以使得整个网上团购系统信息管理的过程得以实现。获取方式:联系QQ422149197软件架构推荐使用:谷歌浏览器后台地址http://lo......
  • sh003基于springboot的汽车租赁系统
    sh003基于springboot的汽车租赁系统 介绍汽车租赁系统管理员功能主要包括:系统设置管理、用户管理、留言板管理、公告类型管理、公告管理等功能由于本系统的功能模块设计比较全面,所以使得整个汽车租赁系统信息管理的过程得以实现。软件架构推荐使用:谷歌浏览器前台登录页......
  • sh001基于springboot+vue的线上医院挂号系统[带LW文档]
    介绍线上医院挂号系统管理员功能主要包括:个人信息管理、用户管理、论坛管理、医生管理、医生留言管理、单页数据管理、个人中心基础数据管理、医生挂号订单管理、轮播图设置等功能由于本系统的功能模块设计比较全面,所以使得整个线上医院挂号系统信息管理的过程得以实现。获取......
  • linux下springboot项目nohup日志或tomcat日志切割处理方案
    https://juejin.cn/post/7081890486453010469通常情况下,我们的springboot项目部署到linux服务器中,通过nohupjava-jarxxx.jar&指令来进行后台运行我们的springboot项目。这种方式针对中小型项目来说,还是比较简单方便的。通过nohup运行springboot项目,默认日志输出到当前目......
  • SpringBoot模块集成mqtt代码实现
    1//引入pom2<!--mqtt-->3<dependency>4<groupId>org.springframework.boot</groupId>5<artifactId>spring-boot-starter-integration</artifactId>6</dependency>......