最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。
由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出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
的断言工具类,在开发的时候,可以直接使用!