Spring boot(18) spring mvc请求参数的校验和处理规范

26 篇文章 0 订阅
17 篇文章 1 订阅

一.参数校验

1.需要参数校验的场景
(1)调用频次低的方法。
(2)执行时间开销很大的方法。
(3)需要提高稳定性和可用性的方法。
(4)对外提供的开放接口,api、rpc、http等。
(5)敏感权限的入口。
2.不需要校验参数的场景
(1)极有可能被循环调用的方法。
(2)底层调用频度比较高的方法,一般有错误提前就暴露了。
(3)被声明成私有方法。能够保证传入的参数提前做过检查。

二,参数的传入

http是个文本协议,所有上传的参数和接收的信息都是字符串。

1.parameters的方式,参数以一个个键值对传入

示例1:parameters的方式

function test_ajax(){
    $.ajax({
        type: "POST",
        url: "tst",
        data: {
            openid: "testajax",
            sign: "testsign"
        },
        success: function(data) { 
            console.log(data)
        },
        error: function() {
            alert("fail!!!,请刷新再试!");
        }
    });
}
function test_post(){
    $.post("tst", {"openid":"testOpenid2","sign":"testSign2"},function(data){
        console.log("post "+data);
    });
}

相当于访问http://localhost:8060/tst?openid=testajax&sign=testsign
注意参数都是有名字的。

后端接收HttpServletRequest:

@RequestMapping("/tst")
    public Object get_value(HttpServletRequest req) {
        Map<String, String> map = HttpHeadUtil.getParamsMapLimit(req);
        return map;
    }

jemeter请求数据:

POST http://localhost:8060/tst

POST data:
openid=testopneid&sign=testsign

[no cookies]

Request Headers:
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
Host: localhost:8060
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_131)

jmeter 响应数据

{"openid":"testopneid","sign":"testsign"}

还有其他的接收方式:

@RequestMapping("/del_goods")
    void del_goods(HttpServletRequest req, HttpServletResponse resp, String sn, String shop_sn){}
    void add_goods(@RequestParam String shop_sn, 
@RequestParam String goods_desc, 
@RequestParam Optional<Integer> point_need,){
2. requestBody的方式传入

消息参数没有name,传入的是个json字符串,也就是说消息体本身就是个唯一参数。

function testbody_ajax(){
    $.ajax({
        type: "POST",
        dataType: 'json', 
        contentType:"application/json",
        url: "tstbody",
        data: '{ "openid": "testajax", "sign": "testsign" }',
        success: function(data) { 
            console.log(data);
        },
        error: function() {
            alert("fail!!!,请刷新再试!testbody_ajax");
        }
    });
}

后台接收

    public static class LoginRequestVO implements Serializable{
        private static final long serialVersionUID = 1L;
        public String openid;
        public String sign;
    }

    @RequestMapping("/tstbody")
    public Object tstBody(@RequestBody LoginRequestVO test) {...}

需要注意的是 起作用的是消息头contentType:”application/json”, 这个消息头
代表上传的消息体是个json,没有参数名,而且消息体本身是个json。
这样spring在接收的时候会做处理,将json转为一个对象。这时候用request.getParameters是获取不到这个请求信息的。
从jemeter看请求和响应:

POST http://localhost:8060/tstbody

POST data:
{"openid":"jmeter","sign":"sign"}

[no cookies]

Request Headers:
Connection: keep-alive
content-type: application/json
: 
Content-Length: 33
Host: localhost:8060
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_131)
{"result":1,"data":{"openid":"jmeter","sign":"sign"}}

其他

注意上一个例子ajax的这个 dataType: ‘json’, 代表接收到返回结果后会转化为一个json对象而不是一个json字符串不要跟spring mvc的参数和消息头弄混了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值