java中如何编写出优雅的Controller呢?
下文笔者讲述写出优美的Controller的注意事项及操作方法,如下所示
java代码编写优美的Controller,只需注意以下几点即可 1.安全性 2.可重复调用 3.稳定性 4.日志全面,方便问题排查 =========================================================== 具体的相关说明,如下所示
1.签名
为避免Controller接口中的数据被篡改
我们需要对Controller接口接收和输出的数据进行签名操作
1.常见的签名方法:
接口请求方将请求参数 + 时间戳 + 密钥拼接成一个字符串
然后使用md5等hash算法,生成一个前面sign。
2.在请求参数或者请求头中
增加sign参数,传递给API接口。
3.当API接口的网关服务
获取到该sign值
然后用相同请求参数 + 时间戳 + 密钥拼接成一个字符串
用相同的m5算法生成另外一个sign
对比两个sign值是否相等。
3.1 当两个sign相等,则认为是有效请求
API接口的网关服务会将给请求转发给相应的业务系统。
3.2 当两个sign不相等,则API接口的网关服务会直接返回签名错误。
2.加密
controller中如何传递敏感数据,如:
用户登录密码,银行卡号、转账金额、用户身份证等
这些信息我们通常使用 “非对称加密”的方式,对敏感数据进行加密和皆灭操作
3.ip白名单
为避免接口的签名及加密都泄漏,那么此时我们还可以对接口增加IP白名单
这种方式,就可以再一次保证接口的安全
4.限流
避免接口使用多,我们可以对接口进行相应的限流
限流方法有三种:
对请求ip做限流:
如同一个ip,在一分钟内,对API接口总的请求次数,不能超过10000次。
对请求接口做限流:
如同一个ip,在一分钟内,对指定的API接口,请求次数不能超过2000次。
对请求用户做限流:
如同一个AK/SK用户,在一分钟内,对API接口总的请求次数,不能超过10000次。
实际工作中
可通过nginx,redis或者gateway实现限流的功能。
5.参数校验
日常开发中,我们必须对传入的参数做严格限制
如:
校验必填字段是否为空,校验字段类型,校验字段长度,校验枚举值等等。
验证参数可对一些无效的请求做相应的拦截
========================================================
例:
1.在新增数据时
字段长度超过数据字段的最大长度
数据库会直接报错
在参数验证层面拦截,避免进入数据库,减少数据库的压力
2.一些收款金额,避免为负数
等等等
6.统一返回值
调用过别人API接口
正常返回数据是一种json格式
如:
{
"code":0,
"message":null,
"data":[{"id":88888,"name":"java265.com"}]
},
签名错误返回的json格式:
{
"code":1001,
"message":"签名错误",
"data":null
}
没有数据权限返回的json格式:
{
"rt":10,
"errorMgt":"没有权限",
"result":null
}
7.统一封装异常
如:
API接口服务器返回异常时
默认会返回SQL异常
此时我们应该避免返回的异常信息,弹出SQL语句,表结构信息
应该统一返回的信息,为指定的文字
8.请求日志
由于涉及三方接口交互,此时我们需进行相应的请求日志,
如: API接口的请求url、请求参数、请求头、请求方式、响应数据和响应时间等,记录到日志文件
当然有 traceId 更好,后续方便联调和追踪
例:在request头上,加入 x-traceId 等信息 在各系统的日志中,记录 x-traceId
9.幂等设计
在极短的时间内,请求我们接口多次
如:在1秒内请求两次。有可能是他们业务系统有bug
或
在做接口调用失败重试
因此我们的API接口需要做幂等设计。
例:
第一次请求数据库会新增数据
第二次请求以后就不会新增数据,但也会返回成功。
这样做的目的是不会产生错误数据。
日常开发中
可通过在数据库中增加唯一索引
或
在redis保存requestId和请求参来保证接口幂等性
10.限制记录条数
限制接口 传入参数的大小及返回数据的行数大小
避免接口资源的浪费
11.压测
上线前,需对接口进行压测
了解各接口的QPS情况
12.异步处理
API接口如果同步处理,则会使接口返回的非常慢 此时我们应该将可以异步处理的消息,进行MQ等缓存,然后使用另外一个服务去消费 采用这样的方式,则会使系统的速度更快
13.数据脱敏
在接口返回敏感信息中 直接对敏感数据进行加密 如: 用户手机号、银行卡号等 我们需对敏感数据进行加密保护
14.完整的接口文档
列举各接口的功能
使用说明
返回示例
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


