阿粉写了八千多字,只为讲透参数合法性验证)(一)

简介: 最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。

最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。

由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。

至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。

所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。

一、介绍

关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证以外,后端依然还需要进行验证,以防不合规的数据直接进入后端,严重的甚至会造成系统直接崩溃

本文结合自己在项目中的实际使用经验,主要以实用为主,对数据合法性验证做一次总结,不了解的朋友可以学习一下,同时可以立马实践到项目上去。

下面我们通过几个示例来演示如何判断参数是否合法,不多说直接开撸!

二、断言验证

对于参数的合法性验证,最初的做法比较简单,自定义一个异常类。

public class CommonException extends RuntimeException {
    /**错误码*/
    private Integer code;
    /**错误信息*/
    private String msg;
    //...set/get
    public CommonException(String msg) {
        super(msg);
        this.msg = msg;
    }
    public CommonException(String msg, Throwable cause) {
        super(msg, cause);
        this.msg = msg;
    }
}

当判断某个参数不合法的时候,直接抛异常!

@RestController
public class HelloController {
 @RequestMapping("/upload")
 public void upload(MultipartFile file) {
  if (file == null) {
   throw new CommonException("请选择上传文件!");
  }
  //.....
 }
}

然后写一个统一异常拦截器,对抛异常的程序进行处理。

这种做法比较直观,如果当前参数既要判断是否为空,又要判断长度是否超过最大长度的时候,代码就显得有点多了

于是,程序界的大佬想到了一个更加优雅又能节省代码的方式,创建一个断言类工具类,专门用来判断参数的是否合法,如果不合法,就抛异常!

/**
 * 断言工具类
 */
public abstract class LocalAssert {
 public static void isTrue(boolean expression, String message) throws CommonException {
  if (!expression) {
   throw new CommonException(message);
  }
 }
 public static void isStringEmpty(String param, String message) throws CommonException{
  if(StringUtils.isEmpty(param)) {
   throw new CommonException(message);
  }
 }
 public static void isObjectEmpty(Object object, String message) throws CommonException {
  if (object == null) {
   throw new CommonException(message);
  }
 }
 public static void isCollectionEmpty(Collection coll, String message) throws CommonException {
  if (coll == null || (coll.size() == 0)) {
   throw new CommonException(message);
  }
 }
}

当我们需要对参数进行验证的时候,直接通过这个类就可以完成基本操作,方式如下:

@RestController
public class HelloController {
 @RequestMapping("/save")
 public void save(String name, String email) {
  LocalAssert.isStringEmpty(name, "用户名不能为空!");
  LocalAssert.isStringEmpty(email, "邮箱不能为空!");
  //.....
 }
}

相比上个步骤,当要判断的参数比较多时,代码明显简洁多了!

类似这样的工具类,spring也提供了一个名为Assert的断言工具类,在开发的时候,可以直接使用!20.jpg


相关文章
|
JavaScript 前端开发
🎖️typeScrpt中如何从验证字符串?
模板文字类型本质上是一种字符串类型。通过定义字符串必须匹配的模式,这些类型提供了一种验证和推断数据的方式。它们是大约三年前在 TypeScript 4.1 中引入的。根据最初的 GitHub PR,以下示例演示了 TypeScript 利用模板文字类型获得的多功能特性。
113 0
|
消息中间件 JavaScript 小程序
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
|
测试技术
字符串a和他许久未见面的同父异母的b(模拟)(思维)
字符串a和他许久未见面的同父异母的b(模拟)(思维)
75 0
|
Java 数据库连接 Spring
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
参数校验别再写满屏的 if/else 了,差点被劝退…(上)
117 0
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
|
算法 数据安全/隐私保护
软考加密类型题(7个历年类型题【答案在底部】选择题1分必得)
对称秘钥算法也叫:私钥、私有秘钥、共享秘钥。 非对称秘钥算法也叫:公钥、公开秘钥、数字签名。 还有消息摘要加密:MD5
246 0
软考加密类型题(7个历年类型题【答案在底部】选择题1分必得)
|
Java 编译器
七千字带你了解封装等机制下
七千字带你了解封装等机制下
90 0
七千字带你了解封装等机制下
|
存储 SQL 安全
七千字带你了解封装等机制上
七千字带你了解封装等机制上
107 0
七千字带你了解封装等机制上
|
安全 算法 Java
[超长文,谨入]一文解决面试、工作遇到的安全性问题
安全问题其实是很多程序员容易忽略的问题但需要我们重视起来,提高应用程序的安全性。常出现的安全问题包括,程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行校验,则可能会引发安全问题等等
333 0
[超长文,谨入]一文解决面试、工作遇到的安全性问题
参数校验别再写满屏的 if/else 了,差点被劝退……(下)
参数校验别再写满屏的 if/else 了,差点被劝退……(下)
110 0
|
测试技术 数据库
测试用例(包含测经典试点全集图解,强烈建议保存收藏)(一)
测试用例(Test Case)是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,用于核实是否满足某个特定软件需求。
651 1
测试用例(包含测经典试点全集图解,强烈建议保存收藏)(一)