当前位置: 首页 > 编程日记 > 正文

SpringMVC + Hibernate-Validator 参数校验

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前言:

Web开发中,最为常见的场景就是前端表单数据、Json数据与后端实体类的绑定,即使JS能校验并阻止大部分的必填漏填的风险,但并不能防止恶意破坏者修改脚本。因此后端参数校验必不可少,但如果针对每一个请求都写硬代码校验,必然会增加许多重复、冗长的代码。

解决:

使用SpringMVC + Hibernate-Validator 进行参数校验,并反馈校验信息给前端。

实现:

maven依赖:

    <properties><hibernate-version>4.3.1.Final</hibernate-version><spring-version>4.3.7.RELEASE</spring-version><jackson-version>2.7.4</jackson-version></properties><dependencies><!--Hibernate注解--><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-version}</version></dependency><!--Spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring-version}</version></dependency><!--支持@ResponseBody注解返回Json--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson-version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson-version}</version></dependency></dependencies>

实体类:

/*** 功能描述:用户实体类** @author menghao* @date 2017/8/30*/
public class User {@NotBlank(message = "用户名必填")private String name;@NotNull(message = "年龄必填")private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

spring-mvc.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.menghao.validator.controller"/><mvc:annotation-driven validator="validator" /><bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name="providerClass" value="org.hibernate.validator.HibernateValidator"/></bean>
</beans>

场景——Js对象请求:

controller:

/*** 功能描述:UserController** @author menghao* @date 2017/8/30*/
@Controller
@RequestMapping("user")
public class UserController {@PostMapping@ResponseBodypublic Result user(@Validated User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {List<String> errMsg = new ArrayList<String>(bindingResult.getFieldErrorCount());for (FieldError error : bindingResult.getFieldErrors()) {errMsg.add(error.getDefaultMessage());}return new Result(false, errMsg);}return new Result(true, "参数正确");}
}

测试结果:

//请求
var param = {name : "11",age : 11
};
$.ajax({url : '/user',data : param,type : 'POST'
});//响应
{"success": true, "data": "参数正确"
}//请求
$.ajax({url : '/user',type : 'POST'
});//响应
{"success": false, "data": ["用户名必填", "年龄必填"]
}

场景——Json格式请求:

controller:

/*** 功能描述:UserController** @author menghao* @date 2017/8/30*/
@Controller
@RequestMapping("user")
public class UserController {@PostMapping@ResponseBodypublic Result user(@RequestBody @Validated User user) {return new Result(true, "参数正确");}/*** 当Controller中方法抛出异常时会进入该方法** @param e 捕获异常* @return Result 校验信息*/@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseBodypublic Result catchException(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult();List<String> errMsg = new ArrayList<String>(bindingResult.getFieldErrorCount());for (FieldError error : bindingResult.getFieldErrors()) {errMsg.add(error.getDefaultMessage());}return new Result(false, errMsg);}}

测试结果:

//请求
{"name" : "menghao"
}//响应
{"success": false,"data": ["年龄必填"]
}//请求
{"name" : "menghao","age" : 22
}//响应
{"success": true,"data": "参数正确"
}

总结:

如果请求参数为Json格式,需要对参数添加@RequestBody,否则无法将数据绑定到对象(值为null)。因此如果继续使用  @Validated User user, BindingResult bindingResult  ,会造成请求失败,无法进入对应方法。

但是仍然需要返回校验信息的话,就需要采用异常处理的方式了。在参数校验失败时会抛出MethodArgumentNotValidException异常,这里采用了@ExceptionHandler来处理。其他常用的处理方式还有:

<1>实现HandlerExceptionResolver类,在resolveException方法中处理逻辑,不过局限在于返回的类型为ModelAndView。

<2>自定义类,使用@controlleradvice注解标记类,并自定义方法来处理捕获异常逻辑,仍然使用@ExceptionHandler注解来标记方法,并在注解value属性中指明捕获的异常类型。

转载于:https://my.oschina.net/marvelcode/blog/1526294

相关文章:

深入浅出,机器学习该怎么入门?

来源 | 算法进阶责编 | 寇雪芹头图 | 下载于视觉中国前言&#xff1a;机器学习作为人工智能领域的核心组成&#xff0c;是计算机程序学习数据经验以优化自身算法&#xff0c;并产生相应的“智能化的”建议与决策的过程。一个经典的机器学习的定义是&#xff1a;A computer prog…

防止SQL注入式攻击

1将sql中使用的一些特殊符号&#xff0c;如 -- /* ; %等用Replace()过滤&#xff1b;2限制文本框输入字符的长度&#xff1b;3检查用户输入的合法性&#xff1b;客户端与服务器端都要执行&#xff0c;可以使用正则。4使用带参数的SQL语句形式。 尽量用存储过程

js中document.write的那点事

document.write()方法可以用在两个方面&#xff1a;页面载入过程中用实时脚本创建页面内容&#xff0c;以及用延时脚本创建本窗口或新窗口的内容。该方法需要一个字符串参数&#xff0c;它是写到窗口或框架中的HTML内容。这些字符串参数可以是变量或值为字符串的表达式&#xf…

SVN提示被锁定的解决方法(转)

1、&#xff08;常用&#xff09;出现这个问题后使用“清理”即"Clean up"功能&#xff0c;如果还不行&#xff0c;就直接到上一级目录&#xff0c;再执行“清理”&#xff0c;然后再“更新”。 2、&#xff08;没试过&#xff09;有时候如果看到某个包里面的文件夹没…

征集佳句-精妙SQL语句收集

征集佳句-精妙SQL语句收集 SQL语句先前写的时候&#xff0c;很容易把一些特殊的用法忘记&#xff0c;我特此整理了一下SQL语句操作&#xff0c;方便自己写SQL时方便一点&#xff0c;想贴上来&#xff0c;一起看看&#xff0c;同时希望大家能共同多多提意见&#xff0c;也给我…

【WP8】ResourceDictionary

WP8中引用资源字典 当我们定义的样式太多的时候&#xff0c;我们可以把样式分别定义在不同的文件中&#xff0c;然后通过 MergedDictionaries 应用到其他资源字典中&#xff0c;看下面Demo 我们可以把样式定义在多个文件中&#xff0c;然后再App.xaml中引用 我们先定义三个文件…

拿来就能用! CTO 创业技术栈指南!

作者 | Nitin Aggarwal译者 | 弯月出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;随着开发运维概念的诞生&#xff0c;以及“You build it, you run it.”&#xff08;谁构建&#xff0c;谁运维&#xff09;理念的盛行&#xff0c;现代创业公司的技术栈也发生了许…

Go处理百万每分钟的请求

2019独角兽企业重金招聘Python工程师标准>>> I have been working in the anti-spam, anti-virus and anti-malware industry for over 15 years at a few different companies, and now I know how complex these systems could end up being due to the massive a…

data pump工具

expdp和impdp的用法ORCALE10G提供了新的导入导出工具&#xff0c;数据泵。Oracle官方对此的形容是&#xff1a;OracleDataPump technology enables Very High-Speed movement of data and metadata from one database to another.其中Very High-Speed是亮点。先说数据泵提供的主…

游标对于分页存储过程

1。我个人认为最好的分页方法是: Select top 10 * from table where id>200写成存储过程,上面的语句要拼一下sql语句,要获得最后大于的哪一个ID号 2。那个用游标的方式,只适合于小数据量的表,如果表在一万行以上,就差劲了 你的存储过程还比不上NOT IN分页,示例: SELECT …

混沌、无序、变局?探索之中,《拟合》开启

从无序中寻找踪迹&#xff0c;从眼前事探索未来在东方的神话里&#xff0c;喜鹊会搭桥&#xff0c;银河是条河&#xff0c;两端闪耀的牵牛星和织女星&#xff0c;则是一年一相会的佳偶&#xff0c;他们彼此间的惦念&#xff0c;会牵引彼此在七夕那天实现双星聚首。在西方的世界…

linxu 下安装mysql5.7.19

2019独角兽企业重金招聘Python工程师标准>>> 1、首先检查是否已经安装过mysql,查找mysql相关软件rpm包 # rpm -qa | grep mysql 2、将所有与mysql相关的东西删除 #yum -y remove mysql-libs-5.1.66-2.el6_3.x86_64 3、安装依赖包 #yum -y install make gcc-c cmake …

C#技术内幕 学习笔记

引用类型是类型安全的指针&#xff0c;它们的内存是分配在堆&#xff08;保存指针地址&#xff09;上的。String、数组、类、接口和委托都是引用类型。 强制类型转换与as类型转换的区别&#xff1a;当类型转换非法时&#xff0c;强制类型转换将抛出一个System.InvalidCastExce…

java的深度克隆

原文&#xff1a;http://blog.csdn.net/randyjiawenjie/article/details/7563323javaobjectinterfacestringclassexception先做个标记 http://www.iteye.com/topic/182772 http://www.blogjava.net/jerry-zhaoj/archive/2009/10/14/298141.html 关于super.clone的理解 http://h…

持续推进预估时间问题研究,滴滴盖亚计划开放ETA数据集

4月29日消息&#xff0c;为持续推进行程时长预估问题研究&#xff0c;滴滴联合GIS(地理信息系统)领域国际顶会ACM SIGSPATIAL发布ACM SIGSPATIAL GISCUP 2021比赛&#xff0c;鼓励研究者们基于滴滴新开放的行程时长数据集&#xff0c;进一步提升时间预估准确性。 预估到达时间…

3.Java集合-HashSet实现原理及源码分析

一、HashSet概述&#xff1a; HashSet实现Set接口&#xff0c;由哈希表&#xff08;实际上是一个HashMap实例&#xff09;支持&#xff0c;它不保证set的迭代顺序很久不变。此类允许使用null元素 二、HashSet的实现&#xff1a; 对于HashSet而言&#xff0c;它是基于HashMap实现…

一个函数返回多个值

有两种方法&#xff1a;1.使用指针变量声明函数&#xff08;或者使用数组变量&#xff09;2.使用传出参数 第一种方法&#xff1a;函数返回的是一个指针地址&#xff08;数组地址&#xff09;&#xff0c;这个内存地址有多个变量寄存在里面。这个方法我不太会用&#xff0c;传…

4月30日或为上半年“最难打车日”

滴滴出行昨日发布预测&#xff0c;称由于周五通勤晚高峰及假期启程高峰叠加&#xff0c;4月30日下午或将成为今年上半年“最难打车日”&#xff0c;用户将遇到叫车排队甚至打不到车的情况。滴滴呼吁&#xff0c;请提前规划行程&#xff0c;预留充足时间&#xff0c;大家五一快乐…

exchange 2003配置ASSP 反垃圾邮件

Exchange上第三方反垃圾邮件用得比较多的是ORF&#xff0c;它直接运行在虚拟SMTP服务上&#xff0c;配置非常的方便。ASSP&#xff08;https://sourceforge.net/projects/assp/&#xff09; 是一个开源的反垃圾邮件代理&#xff0c;反垃圾效果也非常好&#xff0c;这里不讲如何…

中国人工智能学会通讯——人工智能在各医学亚专科的发展现状及趋势 1.3 人工智能在各医学亚专科的发展态势...

1.3 人工智能在各医学亚专科的发展态势 1. 人工智能在眼科领域的应用 2016年11月&#xff0c;Google的研究者Gulshan博士等人在美国医学协会杂志“Journal of the American Medical Association”上发表的一篇文章&#xff0c;运用deep learning算法&#xff08;卷积神经网络&a…

在ASP.NET中如何用C#.NET实现基于表单的验证

这篇文章引用到了Microsoft .NET类库中的以下名空间&#xff1a; System.Data.SqlClient System.Web.Security &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff…

PHP学习笔记 第八讲 Mysql.简介和创建新的数据库

八、Mysql.简介和创建新的数据库1、mysql简介与概要mysql是一个小型关系型数据管理系统&#xff0c;开发者为瑞典mysqlab公司现在已经被sun公司收购1.可以处理拥有上千万条记录的大型数据2.支持常见SQL语句规范3.可移植高&#xff0c;安装简单小巧4.良好的运行效率&#xff0c;…

摆脱 FM!这些推荐系统模型真香

‍‍作者 | 梁唐来源 | TechFlow之前我们介绍了推荐当中应用得非常广泛的FM大家族&#xff0c;从FM这个模型衍生出了一系列的模型&#xff0c;从纯FM&#xff0c;到AFM、FFM、DeepFM等等一系列的FM模型&#xff0c;最后的终极版本是xDeepFM。这个模型非常复杂&#xff0c;可以说…

新技术、新思维开创公共安全管理新模式

智慧城市的建设在国内外许多地区正如火如荼的进行中&#xff0c;在为期六天的第十七届中国国际高新技术成果交易会&#xff08;高交会&#xff09;上&#xff0c;智慧城市这一话题再次引发观众及城市建设者们的热议。 尤其是高交会期间召开的“2015亚太智慧城市发展高峰论坛”&…

.Net 中字符串性能

Introduction 你在代码中处理字符串的方法可能会对性能产生令人吃惊的影响。在本文中&#xff0c;我需要考虑两个由于使用字符串而产生的问题&#xff1a;临时字符串变量的使用和字符串连接。 Background 每个项目都有需要你为其考虑编码标准的时候。使用 FxCop 是一个好的开…

Lambda表达式可以被转换为委托类型

void Main() { //向Users类中增加两人; List<Users> usernew List<Users>{ new Users{ID1,Name"Jalen",Age23}, new Users{ID12,Name"Administrator",Age32}, }; //接下来就是利用Linq提供的新的方法来进行相关操作; var userslistuser.Wher…

人工干预如何提高模型性能?看这文就够了!

作者 | Preetam Joshi译者 | 吴家帆出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;有一些行业对误报非常敏感&#xff0c;如金融行业&#xff0c;在对信用卡欺诈检测时&#xff0c;如果检测系统将用户的行为错误地分类为欺诈&#xff0c;这将对该金融机构的声誉产生…

一种无需留坑为页面动态添加View方案

在Activity或Fragment页面动态添加View&#xff0c;有其应用场景&#xff0c;比如配合运营在首页动态插入H5活动页&#xff08;如下图手淘的雪花例示[1]&#xff09;,在页面头部插入通知View等。本文结合ActivityLifecycleCallbacks[2]及DecorView使用&#xff0c;为类似需求提…

边缘加速创新和AI应用,Xilinx推出Kria自适应系统模块产品组合

为了帮助开发者更容易使用FPGA和SoC的功能&#xff0c;赛灵思在开发工具上做了不少的投入&#xff0c;自适应系统模块&#xff08;SOM&#xff09;产品组合就是其中之一。 近日&#xff0c;赛灵思宣布推出Kria™自适应系统模块&#xff08; SOM &#xff09;产品组合&#xff…

windows计算器

using System; using System.Drawing; using System.Windows; using System.Windows.Forms; using System.Collections; using System.ComponentModel; using System.Data; namespace comput{ /// <summary> /// 这是一个计算器的简单实现。 /// </summary&…