1. 背景
为啥需要参数校验?
1. 修改前端代码,导致前端卡控失效
2. 微服务之前调用,参数漏传
3. 安全性,绕过前端校验,参数直接发送到后台
参数校验的好处?
避免产生垃圾数据,业务按照正常的数据流执行,减小运维工作量
目前大多数参数校验和业务层代码耦合在一起,修改起来比较麻烦,并且也容易出错。最近写了一套参数校验框架,已发布到Maven中央仓库,代码已在Github开源。
2. 框架介绍
2.1 功能介绍
读取配置文件,每个参数可以配置多个校验规则。目前支持json、xml 格式配置。支持一个参数配置多个校验器,正则表达式校验器,OGNL表达式校验器,自定义校验器。
2.2 设计思路
api 请求到达Web 服务器之后,经过 ParamFiletr, 把校验任务交给 ValidateProcessor 处理。ValidateProcessor 负责匹配 请求的 url 与配置文件中的 url. 匹配到 url之后,根据配置的参数 urlParams、pathParams、bodyParams, 交给对应的处理器进行处理。每个参数可以配置多个校验规则,目前支持正则表达式校验器,OGNL校验器,自定义校验器。如果某个校验规则不通过,返回错误信息。
2.2 配置文件
配置文件分成两部份,第一部份,一个common配置文件,文件命名格式 validate_common_config + 文件类型。第二部份,多个参数校验配置文件,原则上一个 controller 层配置一个, 文件命名格式 validate_rule_ + xxx + 文件类型。
common 配置文件示例
1. json 格式
{
"checkAllUrl": false,
"whiteList" : [
"/**/*.html",
"/**/*.js",
"/**/*.css"
],
"maxBodySize": 100000
}
2. xml 格式
<?xml version="1.0" encoding="UTF-8" ?>
<common>
<checkAllUrl>false</checkAllUrl>
<whiteList>
<url>/**/*.html</url>
<url>/**/*.js</url>
<url>/**/*.css</url>
</whiteList>
<maxBodySize>100000</maxBodySize>
</common>
参数名字 | 作用 | 默认值 |
checkAllUrl | 是否校验所有url | false |
whiteList | 白名单列表 | |
maxBodySize | 请求体大小 | 10000字节 |
api接口 配置文件示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE urls SYSTEM "validate_param_rule_config.dtd">
<urls>
<item url="/param/body/{key}" method="post" maxBodySize="1000" sort="0">
<urlParams>
<param name="taskId" nullable="true">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
</rules>
</param>
</urlParams>
<pathParams>
<param name="{key}">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
</rules>
</param>
</pathParams>
<bodyParams>
<param name="id">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
<rule name="DEFINE" value="scd.util.define.DefineParamValidator" />
</rules>
</param>
<param name="list" nullable="true">
<rules>
<rule name="DEFINE" value="scd.processor.define.ComplexJsonValidator"/>
</rules>
</param>
</bodyParams>
</item>
<item url="/param/body/{key}/test" method="post" maxBodySize="100" sort="1">
<urlParams>
<param name="taskId" nullable="true">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
</rules>
</param>
</urlParams>
<pathParams>
<param name="{key}">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
</rules>
</param>
</pathParams>
<bodyParams>
<param name="id">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
<rule name="DEFINE" value="com.scd.util.define.ParamDefineValidator" />
</rules>
</param>
</bodyParams>
</item>
<item url="/param/{key}/url/param" method="post" maxBodySize="100" sort="1">
<pathParams>
<param name="{key}">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
</rules>
</param>
</pathParams>
<bodyParams>
<param name="id">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
<rule name="DEFINE" value="com.scd.util.define.ParamDefineValidator" />
</rules>
</param>
</bodyParams>
</item>
<item url="/param/body" method="post" maxBodySize="1000" sort="0">
<bodyParams>
<param name="id">
<rules>
<rule name="REGEXP" value="\d+{0,20}" />
<rule name="DEFINE" value="scd.util.define.DefineParamValidator" />
</rules>
</param>
<param name="list" nullable="true">
<rules>
<rule name="DEFINE" value="scd.processor.define.ComplexJsonValidator"/>
</rules>
</param>
</bodyParams>
</item>
<item url="/param/{path}" method="post" >
<pathParams>
<param name="{path}">
<rules>
<rule name="REGEXP" value="\S+{0,30}" />
<rule name="OGNL" value="@scd.enums.Param@contains(path)" />
</rules>
</param>
</pathParams>
</item>
<item url="/param/{path}/{key}" method="post" sort="1">
<pathParams>
<param name="{path}">
<rules>
<rule name="REGEXP" value="\S+{0,30}" />
<rule name="OGNL" value="@scd.enums.Param@contains(path)" />
</rules>
</param>
</pathParams>
</item>
<item url="/param/url" method="post" >
<urlParams>
<param name="name">
<rules>
<rule name="REGEXP" value="\S+{0,30}" />
</rules>
</param>
<param name="age">
<rules>
<rule name="OGNL" value="age > 10" />
</rules>
</param>
<param name="score">
<rules>
<rule name="OGNL" value="score >= 0 && score <= 100"/>
</rules>
</param>
</urlParams>
</item>
</urls>
3.如何使用项目
demo 项目地址 https://github.com/shootercheng/param-validator-demo
4.项目地址
https://github.com/CatDou/param-validator
https://github.com/CatDou/param-validator-generate
欢迎大家提 Issue 和 pull request