项目中常见的前端校验,比如js校验。
对安全性要求比较高的情况下,需要在服务器端进行校验,
服务端校验:
控制层conroller:校验页面请求的参数的合法性。在服务端控制层conroller校验,不区分客户端类型(浏览器、手机客户端、远程调用)
业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。
持久层dao:一般是不校验的。
springMVC 校验思路:页面请求参数,请求到controller方法中,使用hibernate validator 进行校验,如果出错,则将错误信息展示在页面。
1. 环境准备,给项目中添加hibernate validator jar包
hibernate validator jar包下载:http://hibernate.org/validator/
2. 配置校验器
在springMVC.xml配置文件,添加:
<!-- 校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- hibernate校验器-->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" />
</bean>
3. 将 校验器配置到处理器适配器中,这里配置到mvc 注解驱动中,还是在springMVC.xml文件,对mvc:annotation-driven加载参数。
<mvc:annotation-driven conversion-service="conversionService"
<span style="white-space:pre"> </span>validator="validator"></mvc:annotation-driven>
4.根据步骤2中的设置,新建错误信息文件CustomValidationMessage.properties,这有点儿类似java的国际化操作。
# input validator error
items.name.length.error=items name' length is limited between 1 and 30
items.createtime.isNull=please input createtime
5.在pojo类中添加校验规则,比如名字字符长度限制,非空限制等等。。
package com.bupt.ssm.po;
import java.util.Date;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Items {
private Integer id;
//校验名称1-30,message为提示出错信息
@Size(min=1, max=30, message="{items.name.length.error}")
private String name;
private Float price;
private String pic;
@NotNull(message="{items.createtime.isNull}")
private Date createtime;
private String detail;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic == null ? null : pic.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail == null ? null : detail.trim();
}
}
6.在controller类的方法中使用校验
//在需要校验的poJo类前加 @Validated, 后面加BindingResult bindingResult 存放出错信息。
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model, HttpServletRequest request,Integer id,
@Validated ItemsCustom itemsCustom, BindingResult bindingResult)throws Exception {
<span style="white-space:pre"> </span>if(bindingResult.hasErrors()){
List<ObjectError> allErrors = bindingResult.getAllErrors();
for(ObjectError objectError :allErrors){
System.out.println(objectError.getDefaultMessage());
}
model.addAttribute("allErrors", allErrors);
return "items/editItems";
}
itemsService.updateItems(id, itemsCustom);
// return "success";
return "forward:queryItems.action";
}
7. 在jsp页面中显示错误信息
<!-- 显示错误信息 -->
<c:if test="${allErrors!=null }">
<c:forEach items="${allErrors }" var="error">
${ error.defaultMessage}<br/>
</c:forEach>
</c:if>
8 测试。