JavaWeb API接口参数校验框架

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是否校验所有urlfalse
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 &gt;= 0 &amp;&amp; score &lt;= 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chengdu.S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值