springboot controller 输入参数检查,controller 参数校验

  springboot controller 输入参数检查,controller 参数校验

  00-1010控制器中的注释使用几种传输参数的方法来获得几种常见的参数注释。使用对象直接获取参数。使用@Valid检查和汇总参数。

  

目录

接受参数的几种传输方式以及几种注解:

 

  在上一篇文章中,我们使用JDBC链接数据库,并完成了简单的后端开发。但是正如我上面抛出的问题,我们能更好地优化我们在控制器中接受参数的方式吗?在本文中,我们将讨论如何更有效地接收Json参数。

  00-1010定义Rest接口时,我们通常使用GET、POST、PUT、DELETE来完成一些需要执行CRUD的操作。我们在这里列举并教大家如何在实际开发中使用,这里不再重复一些基本概念,比如使用POST的优缺点,可用参数的大小限制等等:

  GET:一般用于查询数据,不需要更新或插入函数数据。由于是明文传输,我们通常用它来获取一些无关用户的信息。POST:一般用于数据插入,也是使用最多的传输方式。但调用H5时会出现跨域问题,一般用JSONP解决。PUT:我们使用PUT来更新数据。删除:用于删除数据。注意在数据库中是逻辑删除(改变数据状态,用户无法再查询,但仍保留在数据库中)还是物理删除(真删除)。这些是标准的REST风格的接口。事实上,我们可以在源代码中看到,它们只是被封装了。

  @RequestMapping(method={ request method . post })这个方法和我们之前的@ request mapping写后参数是一致的。但是,在实际开发中,我们通常会将前端和后端分开。比如IOS和ANDROID开发会一直使用同一套模板进行传输。这个时候你所有的接口可能都是POST方法。这就需要你在开发的时候提前和前端人员做好约定,然后接口文档就变得非常重要了。方法、参与、参与和错误信息必须在接口文档中描述清楚,所以不要小看写文档的能力。当然SpringBoot也为我们提供了强大的API模板,比如swagger。但是,使用swagger并不是一劳永逸的事情。我们以后再谈斯瓦格。

  00-1010在上一篇文章中,我们使用了几个标注来获取参数,比如@RequestParam、@PathVariable、@RequestBody。现在让我们来看看应该如何逐一使用这些注释。

  @PathVariable:一般我们使用URI模板样式映射,即url/{param},GET、DELETE、PUT方法常用。我们可以获得后跟URL的参数。@RequestParam:一般我们用这个注释来获取多个参数,只需在()中写出要获取的参数的参数名,这是PUT和POST中常用的。@RequestBody:这个注释和@RequestParam目标一致。我们用这个注释来转换所有的参数,在代码部分把它们一个一个拿出来。目前我也是用最多的注释来获取参数(因为前端不愿意一次调试一个接口),比如下面这段代码:@ post mapping(/CreateUserByMap )public void CreateUserByMap(@ RequestBodyMapString,Object req map){ string tel=req map . get( tel )。tostring();String pwd=reqMap.get(pwd )。toString();userService.createUser(tel,pwd);}当然我们得到的参数不仅仅是上面提到的那些,还有@RequestHeader得到头信息中的值,@CookieValue得到Cookie值等等。在这里,我只解释一些常用的值。

  00-1010当我们掌握了以上获取参数的方法,似乎就没有问题了,但还是有一些。如果我们有很多参数呢?一百几十个参数,你是出血一百几十个@RequestParam,还是取一百几十次@RequestBody?显然这些做法很麻烦,代码太多。关键是我们懒.所以,我们也可以通过POJO直接获取参数,然后通过GET方法直接获取需要的参数。

  让我们改变最后一种方法:

  /* * * add user 2 * @ param userinfo */@ post mapping(/create user 2 )public void create user 2(userinfo userinfo){

   userService.createUser(userInfo.getTel(),userInfo.getPassWord());}我们来测试一下,发现失败了,通过错误信息,我们发现SQL提示password为null,也就是说我们没有获取到pwd这个参数,这是因为如果使用对象接受参数,那参数名必须喝对象的属性名保持一致。

  

 

  我们修改参数名为passWord后可以发现,数据可以争产的进行插入了。

  

 

  

 

  

 

  

使用@Valid对参数进行校验

在使用对象进行参数接收时,我们可以对参数进行校验,假设我们需要用户输入的密码是整数型且在000000至999999之间的数值,我们可以对属性passWord加上如下注解:

 

  

@Max(value = 999999,message = "超过最大数值")@Min(value = 000000,message = "密码设定不正确")private String passWord;

这里举的列子并不十分合适,请注意。我们只是针对表单验证进行讲解,在实际开发处理中要选择合适的操作。message是反回的提示默认信息。在controller中我们改写一下,将返回值设为String,让我们可以看到报错信息。

 

  然后我们给对象加入@Valid注解,并在参数中加入BindingResult来获取错误信息。在逻辑处理中我们判断BindingResult知否含有错误信息,如果有错误信息,则直接返回错误信息。

  

/** * 添加用户2 * @param userInfo */@PostMapping("/createUser2")public String createUser2(@Valid UserInfo userInfo, BindingResult bindingResult){ if (bindingResult.hasErrors()){ return bindingResult.getFieldError().getDefaultMessage(); } userService.createUser(userInfo.getTel(),userInfo.getPassWord()); return "OK";}

我们继续通过POSTMAN来测试一下,首先我们传入-10000来设定密码,发现提示错误密码设定不正确:

 

  

 

  发现无法完成用户注册,我们继续通过添加密码为1000000来设定密码,发现提示错误信息超过最大数值:

  

 

  以上就是我们通过简单的表单验证来预防一些恶意数据的侵入。不知道你有没有掌握呢?当然,我们对于数据的验证不仅仅只有表单验证,我们一般通过数据签名的方式来验证一个请求是否合法,也可能是将整个参数进行对称加密后进行传输以保证数据不被明文抓包。

  那以上所说的处理模式就会用到Spring为我们提供的另一个强大的功能,也是我们使用Spring系列框架中不可或缺的一部分,AOP,切面编程。我们之前所说的统一报错处理也是使用的AOP功能进行处理的,那关于AOP,我们下周再聊。(原谅我懒得要死,这篇文章也是被迫赶工的……捂脸,逃……)(◐‿◑)

  以上所有的代码我已经上传到GitHub

  round1-springboot

  如果心急的小伙伴也可以去clone我已经完成的项目,这个项目中把一些常用功能都写了,并且都写注释啦!!!

  MySpringBoot

  

 

  

总结

到此这篇关于SpringBoot开发详解之Controller接收参数及参数校验的文章就介绍到这了,更多相关SpringBoot Controller接收参数及校验内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: