springMVC之数据校验
1、 项目中使用较多的是前端校验
比如页面中js校验。对于安全要求较高的话建议在服务端进行校验。
2、 服务端校验
控制层controller:校验页面请求的参数合法性
业务层service:主要校验关键业务参数,仅限于service接口中使用的参数
持久层dao:一般是不校验的
3、 springmvc的校验
springmvc使用hibernate的校验框架validation。页面提交的请求参数,请求到controller方法中,使用validation进行校验,如果校验出错,将错误信息展示到页面。
3.1、导入相关jar包
3.2、配置校验器
<!-- 配置校验器 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <!-- 加载数据校验的消息文件 --> <property name="basenames"> <list> <value>classpath:UserValidationMessage</value> </list> </property> <!-- 资源文件中内容的缓存时间 单位秒 --> <property name="cacheSeconds" value="120"></property> <!-- 资源文件的编码方式 --> <property name="fileEncodings" value="utf-8"></property> </bean> <!-- 实例化一个校验器对象 --> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <!-- 注入一个具体的校验器:该数据校验器由hibernate-validator.jar提供 --> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> <!-- 加载message资源文件 --> <property name="validationMessageSource" ref="messageSource"></property> </bean> <!-- 开启注解解析器 --> <mvc:annotation-driven validator="validator"></mvc:annotation-driven>
3.3、在vo或者pojo添加校验规则
public class User { // 校验名称在1~6字符中间 @Size(min=1,max=6,message="{user_name.length}") private String name; // 校验非空 @NotEmpty(message="{user_pwd.notNull}") private String pwd; // 校验是否为数字,并且在规定的大小值内 @Max(value=150, message="{user_age.Number}") @Min(value=1, message="{user_age.Number}") private Integer age; // 校验是否为邮件格式 @Email(message="{user_email.email}") private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User [name=" + name + ", pwd=" + pwd + ", age=" + age + ", email=" + email + "]"; } }
3.4、编写校验资源文件
3.5、捕获校验信息并传往页面
/** * @Validated 表示对哪个参数进行校验 * @param user * @param bindingResult 接收校验提示信息 * @return * 注意:@Validated和BindingResult是配对出现,而且形参顺序是固定 */ @RequestMapping("/register") public String register(@Validated User user, BindingResult bindingResult, Model model) { // 获取校验信息 if(bindingResult.hasErrors()) { List<ObjectError> allErrors = bindingResult.getAllErrors(); for (ObjectError objectError : allErrors) { System.out.println(objectError.getDefaultMessage()); } // 将错误信息传到页面 model.addAttribute("allErrors", allErrors); return "/register.jsp"; } return "/index.jsp"; }
3.6、jsp页面
<c:if test="${allErrors != null }"> <c:forEach items="${allErrors }" var="error"> <span style="color: red;">${error.defaultMessage }</span> </c:forEach> </c:if> <form action="register.do" method="post"> 用户名:<input name="name"/><br/> 密码:<input name="pwd"/><br/> 年龄:<input name="age"/><br/> 邮箱:<input name="email"/><br/> <input type="submit" value="注册"/> </form>
4、 分组校验
当需要不同的controller方法对同一个对象进行校验,但是每个controller方法需要不同的校验时,需要分组校验
4.1 定义分组校验(其实就是一个java接口),分组中定义有哪些规则
public interface ValidateGroup1 { // 接口中不需要定义任何方法,仅是对不同的校验进行分组 // 此分组只校验用户名、密码 }
4.2 在校验规则中添加分组
// 校验名称在1~6字符中间 @Size(min=1,max=6,message="{user_name.length}", groups={ValidateGroup1.class}) private String name; // 校验非空 @NotEmpty(message="{user_pwd.notNull}", groups={ValidateGroup1.class})
4.3 使用指定分组校验
@RequestMapping("/login") public String login(@Validated(value={ValidateGroup1.class}) User user, BindingResult bindingResult, Model model) { // 获取校验信息 if(bindingResult.hasErrors()) { List<ObjectError> allErrors = bindingResult.getAllErrors(); for (ObjectError objectError : allErrors) { System.out.println(objectError.getDefaultMessage()); } // 将错误信息传到页面 model.addAttribute("allErrors", allErrors); return "/login.jsp"; } return "/index.jsp"; }