SpringMVC-17-数据校验

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 SpringMVC-17-数据校验,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

10.springmvc数据校验

  • 数据校验分为客户端验证和服务器端验证,客户端验证主要是过滤正常用户的误操作,通过 JavaScript 代码完成(容易被攻击)。服务器端验证是整个应用阻止非法数据的核心,需要在应用中编程实现。

  • springmvc提供两种验证方式

spring自带的验证框架

JSR303校验框架: Java 为 Bean 数据合法性校验所提供的标准框架。JSR303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解制定校验规则,并通过标准的验证接口对 Bean 进行验证

  • 使用JSR303校验框架不需要编写验证类,直接在实体类属性和变量上加注解实现
  • 但spring自身没有对jsr303实现,而hibernate-validator对其进行了实现,所以需要导入hibernate-validator的依赖,Spring 将会自动加载并装配。
<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.1.0.CR2</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>7.0.4.Final</version>
        </dependency>
  • javax validator内置注解
名称 说明
@Null 被标注的元素必须为 null
@NotNull 被标注的元素必须不为 null
@AssertTrue 被标注的元素必须为 true
@AssertFalse 被标注的元素必须为 false
@Min(value) 被标注的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被标注的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMax(value) 被标注的元素必须是一个数字,其值必须大于等于指定的最大值
@DecimalMin(value) 被标注的元素必须是一个数字,其值必须小于等于指定的最小值
@size 被标注的元素的大小必须在指定的范围内
@Digits(integer,fraction) 被标注的元素必须是一个数字,其值必须在可接受的范围内;integer 指定整数精度,fraction 指定小数精度
@Past 被标注的元素必须是一个过去的日期
@Future 被标注的元素必须是一个将来的日期
@Pattern(value) 被标注的元素必须符合指定的正则表达式

Hibernate Validator 附加的注解:

@Email:被注释的元素必须是电子邮箱地址

@Length:被注释的字符串的大小必须在指定的范围内

@NotEmpty:被注释的字符串的必须非空

@Range:被注释的元素必须在合适的范围内

@NotBlank:验证字符串非null,且长度必须大于0

  • 关于@NotNull,@NotEmpty和@NotBlank之间的区别如以下

@NotNull 适用于任何类型,被标注的元素必须不能为null
@NotEmpty适用于String类型,Map类型或者数组,不能为null,且长度必须大于0
@NotBlank只能用于String类型,不能为null,且调用trim()后,长度必须大于0

通过注解驱动的方式来进行数据校验,Spring 的 DataBinder 在进行数据绑定时,可同时调用校验框架来完成数据校验工作

对同一个Model,我们在增加和修改时对参数的校验也是不一样的,这个时候我们就需要定义分组验证上面每个注解里面有个groups 属性,可以设置不同的操作类add/modify接口值,来进行分组验证参数

添加完需要的校验注解之后,在请求处理方法中的接收的请求参数上添加@Valid注解,即可开启校验功能 如果是分组校验则需要 @Validated 注解

  • 举例测试:

  • 导入上面的3个依赖:注意jboss-logging版本不要用最新版3.1.0.CR2左右,否则容器加载异常

  • 实体类,注意导入注解的包

package com.zk.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

/**
 * @author CNCLUKZK
 * @create 2022/7/8-9:51
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @NotNull(message="账户不为空!")
    private String username;
    @NotNull
    @Length(min = 6, max = 32, message = "用户名不能少于6位大于32位")
    private String pwd;
    @Pattern(regexp = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$",message = "邮箱格式不正确!")
    private String email;

}
  • 控制类
package com.zk.controller;

import com.alibaba.fastjson2.JSON;
import com.zk.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author CNCLUKZK
 * @create 2022/7/8-18:11
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @PostMapping("/getUser")
    @ResponseBody
    public String getUser(@Valid @RequestBody User user, BindingResult result, Model model){
        List<FieldError> allErrors = new ArrayList<>();
        Map<String,String> map = new HashMap();
        // 如果有异常信息
        System.out.println(result.hasErrors()+"|||"+result.getAllErrors().size());
        System.out.println(user.toString());
        if (result.hasErrors()) {
            result.getFieldErrors().forEach(error->{
                String message = error.getDefaultMessage();
                String field = error.getField();
                map.put(field,message);
            });
        }
        // 将异常信息输出
        //model.addAttribute("msg", JSON.toJSONString(map));
        System.out.println(JSON.toJSONString(map));
        return  JSON.toJSONString(map);
    }
}
  • 利用测试类生成JOSN数据,用Postman测试工具进行测试
public class TestDemo {
    @Test
    public void test01(){
        User user = new User();
        user.setUsername("admin");
        user.setPwd("123");
        user.setEmail("11@kkl.com");

        String str = JSON.toJSONString(user);
        System.out.println(str.toString());

    }
}

在这里插入图片描述

下一篇:SpringMVC-18-异常机制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/123885.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!