springMVC------服务器校验
校验理解
项目中,通常使用较多的是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务器进行校验。
服务器校验:
控制层controller:校验页面请求的参数的合法性。在服务端控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程调用)
业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。
持久层dao:一般是不校验的。
springMVC校验
Springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。
校验思路:
页面提交申请参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。
具体需求:
商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息。
环境准备
hibernate-validator-6.0.15.Final.jar
jboss-logging-3.3.2.Final.jar
validation-api-2.0.1.Final.jar
classmate-1.3.4.jar
配置校验器
<!-- 校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- hibernate校验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
<!-- 指定校验使用的资源文件,若不能指定,则默认使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource"></property>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"></property>
</bean>
校验器注入到处理器适配器中
<mvc:annotation-driven conversion-service="conversionService" validator="validator">
</mvc:annotation-driven>
在pojo中添加校验规则
@Size(min=1,max=30,message="{items.name.lenght.error}")
private String name;
@NotNull(message="{items.createtime.isNull}");
private Date createtime;
CustomValidationMessages.properties
#输出校验信息
items.name.lenght.error=请输入1到30个字符的商品信息
items.createtime.isNull=请输入商品的生产日期
捕捉校验信息
// 根据id修改商品信息
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,HttpServletRequest request, Integer id,
@Validated ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception {
//获取校验错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> objectErrors=bindingResult.getAllErrors();
for(ObjectError objectError:objectErrors){
System.out.println(objectError.getDefaultMessage());
}
//将错误信息转到页面
model.addAttribute("allErrors", objectErrors);
//出错重回修改页面
return "forward:selectByPrimaryKey.action";
}
itemsService.updateByPrimaryKeyWithBLOBs(id, itemsCustom);
return "redirect:findItemsList.action";
}
页面显示错误信息
<!-- 显示错误信息 -->
<c:if test="${allErrors!=null && allErrors.size()>0 }">
<c:forEach items="${allErrors }" var="error">
${error.defaultMessage }<br/>
</c:forEach>
</c:if>
分组校验
分组校验需求
在pojo中定义校验规则,而pojo是被多个controller所共用的,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。
解决方法:
定义多个校验分组(其实是一个java接口),分组中定义有哪些规则
每个controller方法使用不停的校验分组
校验分组
创建接口,其内容为空。
在校验规则中添加分组
@Size(min=1,max=30,message="{items.name.lenght.error}",groups={ValidGroup1.class})
private String name;
在controller方法使用指定分组的校验
// 根据id修改商品信息
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,HttpServletRequest request, Integer id,
@Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception {
… …
}
- 浅谈 java 中构建可执行 jar 包的几种方式
- python 日志模块 logging 详解
- 基于堆实现的优先级队列:PriorityQueue 解决 Top K 问题
- explain 深入剖析 MySQL 索引及其性能优化指南
- 图文并茂详解 SQL JOIN
- 自定义 hadoop MapReduce InputFormat 切分输入文件
- Hadoop MapReduce 二次排序原理及其应用
- MySQL Tips【Updating】
- Meltdown、Spectre攻击---CPU乱序执行和预测执行导致的安全问题
- WordPress 4.6远程代码执行漏洞(CVE-2016-10033)复现环境搭建指南
- 相似文档查找算法之 simHash 简介及其 java 实现
- Hadoop 中利用 mapreduce 读写 mysql 数据
- Android O中对TEE加解密算法的新要求
- storm 原理简介及单机版安装指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux系统SSH服务之 sshkey密钥认证实战
- Redis工作中常用命令,看这一篇就够了
- String、StringBuffer、StringBuiler深入分析,看这一篇就够了
- Windows安装pip方法
- 通过jvm字节码研究Synchronized
- 学synchronized锁升级过程,吊打面试官
- jvm启动加载类的全过程,全网最全一篇,告诉你什么是双亲委派机制
- sonar+Jenkins 构建代码质量自动化分析平台
- 几百行代码,实现了微信群聊,神奇!
- 深入解析==与equals()区别
- 工作中常用的十款idea插件
- Linux系统rsync数据同步服务介绍
- 清空表与删除表mysql
- Java虚拟机-JVM组成结构详解
- 解决Chunkize warning while installing gensim问题