SpringBoot结合JSR303对前端数据进行校验的示例代码

一、校验分类

数据的校验一般分为**前端校验后端校验**

二、前端校验

前端校验是最为明显的,先说一下:

① HTML

非空校验HTML5 新增的属性required="true",一旦没有填写就输入框就显示红色,具体使用如:

<input type="text" id="name" name="name" required="true"/>

② JS

同时在提交表单发送 Ajax请求 的时候,来个 onSubmit 函数,具体例如(使用点 EasyUI ):

function submitData(){
		$("#fm").form("submit",{
			url:"/admin/film/save",
			onSubmit:function(){
				var content=CKEDITOR.instances.content.getData();
				if(content==""){
					$.messager.alert("系统提示","内容不能为空!");
					return false;
				}
				return $(this).form("validate");
			},
			success:function(result){
				var result=eval('('+result+')');
				if(result.success){
					$.messager.alert("系统提示","保存成功!");
					resetValue();
				}else{
					$.messager.alert("系统提示","保存失败!");
				}

			}
		});
	}

但我们都知道,这是防君子不防小人的做法,用户可以使用 F12,查看源码,修改关键部位的代码,
如把 required="true" 删除掉,就可以提交表单了。
所以前端作用虽然明显,但是数据处理方面,真正用处并不大。

三、后端校验

前面说了那么多,就是为了引出 后端校验 这一话题。数据是否提交到数据库中去,就看后端的代码了。
后端校验,主要实施在 JavaBean、Controller 中。下面列举一个简单的例子,从代码中说明一切。

① 代码结构图

② entity

实体属性部位空,一般使用如 @NotEmpty(message="请输入用户名!") ,这样既不能为 ,也不能为null

package com.cun.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;

import io.swagger.annotations.ApiModelProperty;

@Entity
@Table(name = "t_person")
public class Person {

	@Id
	@GeneratedValue
	@ApiModelProperty(value = "用户id")
	private Integer id;

	@NotBlank(message = "用户名不能为空") // 为""/''都不行
	@Size(min = 2, max = 30, message = "2<长度<30")
	@Column(length = 50)
	@ApiModelProperty(value = "用户名")
	private String userName;

	@NotNull(message = "用户密码不能为空")
	@Column(length = 50)
	@ApiModelProperty(value = "用户密码")
	private String password;

	@Max(value = 150, message = "age应<150") // 数字
	@Min(value = 1, message = "age应>1") // 数字
	@NotNull(message = "年龄不能为空")
	@ApiModelProperty(value = "用户年龄")
	private Integer age;

	@NotNull(message = "邮箱不为空")
	@Email(message = "邮件格式不对")
	@Column(length = 100)
	@ApiModelProperty(value = "用户邮箱")
	private String email;

	// 使用 JPA 必备
	public Person() {
		super();
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	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;
	}

}

③ dao

其实也没什么代码,这就是 JPA 的强大之处

package com.cun.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import com.cun.entity.Person;

public interface PersonDao extends JpaRepository<Person, Integer>, JpaSpecificationExecutor<Person> {

}

④ Service、ServiceImpl (省略)

⑤ Controller

package com.cun.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cun.dao.PersonDao;
import com.cun.entity.Person;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@RestController
@RequestMapping("/person")
@EnableSwagger2
public class PersonController {

	@Autowired
	private PersonDao personDao;

	@PostMapping("/insert")
	public Map<String, Object> insertPerson(@Valid Person person, BindingResult bindingResult) {
		Map<String, Object> map = new HashMap<String, Object>();
		if (bindingResult.hasErrors()) {
			List<ObjectError> errorList = bindingResult.getAllErrors();
			List<String> mesList=new ArrayList<String>();
			for (int i = 0; i < errorList.size(); i++) {
				mesList.add(errorList.get(i).getDefaultMessage());
			}
			map.put("status", false);
			map.put("error", mesList);
		} else {
			map.put("status", true);
			map.put("msg", "添加成功");
			personDao.save(person);
		}
		return map;
	}

}

⑥ yml

server:
 port: 80 #为了以后访问项目不用写端口号
 context-path: / #为了以后访问项目不用写项目名
spring:
 datasource:
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://localhost:3306/springboot
  username: root
  password: 123
 jpa:
  hibernate:
   ddl-auto: update #数据库同步代码
  show-sql: true   #dao操作时,显示sql语句

⑦ POM

使用 SpringBoot Starter 导入 JPA、MySQL

使用 Swagger 演示

<!-- swagger生成接口API -->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.7.0</version>
		</dependency>

		<!-- 接口API生成html文档 -->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.6.1</version>
		</dependency>

四、演示

输入 http://localhost/swagger-ui.html 进入接口测试站点

什么都没有填写,直接点击Try it out!,可以看到返回给前端的 JSON 数据,这时候数据的数据是没有改动的,一条sql 语句都没有执行

当然还可以进行其他测试,这里就省略了

到此这篇关于SpringBoot结合JSR303对前端数据进行校验的示例代码的文章就介绍到这了,更多相关SpringBoot JSR303校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springboot集成JSR303参数校验的方法实现

    JSR303 是一套 JavaBean 参数校验的标准 1.pom导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.注解类型 (1)空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null,

  • SpringBoot结合JSR303对前端数据进行校验的示例代码

    一.校验分类 数据的校验一般分为**前端校验.后端校验** 二.前端校验 前端校验是最为明显的,先说一下: ① HTML 非空校验 如 HTML5 新增的属性required="true",一旦没有填写就输入框就显示红色,具体使用如: <input type="text" id="name" name="name" required="true"/> ② JS 同时在提交表单发送 Ajax请求

  • SpringBoot实现接口等幂次校验的示例代码

    目录 主流的实现方案如下: 第一步:书写redis工具类 第二步.书写token工具类 第三步:定义注解,使用在方法上,当控制层的方法上被注释时,表示该请求为等幂性请求 第四步:拦截器配置.选择前置拦截器,每次请求都校验到达的方法上是否有等幂性注解,如果有则进行token校验 第五步:对拦截器进行url模式匹配,并注入spring容器 第六步:控制层 接口等幂性通俗的来说就是同一时间内,发起多次请求只有一次请求成功:其目的时防止多次提交,数据重复入库,表单验证网络延迟重复提交等问题. 比如: 订

  • SpringBoot+thymeleaf+Echarts+Mysql 实现数据可视化读取的示例

    目录 实现过程 1. pom.xml 2. 后端程序示例 3. 前端程序示例 通过从数据库获取数据转为JSON数据,返回前端界面实现数据可视化. 数据可视化测试 实现过程 1. pom.xml pom.xml引入(仅为本文示例需要,其他依赖自行导入) <!--Thymeleaf整合security--> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymele

  • SpringBoot整合Redis正确的实现分布式锁的示例代码

    前言 最近在做分块上传的业务,使用到了Redis来维护上传过程中的分块编号. 每上传完成一个分块就获取一下文件的分块集合,加入新上传的编号,手动接口测试下是没有问题的,前端通过并发上传调用就出现问题了,并发的get再set,就会存在覆盖写现象,导致最后的分块数据不对,不能触发分块合并请求. 遇到并发二话不说先上锁,针对执行代码块加了一个JVM锁之后问题就解决了. 仔细一想还是不太对,项目是分布式部署的,做了负载均衡,一个节点的代码被锁住了,请求轮询到其他节点还是可以进行覆盖写,并没有解决到问题啊

  • SpringBoot使用Filter实现签名认证鉴权的示例代码

    情景说明 鉴权,有很多方案,如:SpringSecurity.Shiro.拦截器.过滤器等等.如果只是对一些URL进行认证鉴权的话,我们完 全没必要引入SpringSecurity或Shiro等框架,使用拦截器或过滤器就足以实现需求.         本文介绍如何使用过滤器Filter实现URL签名认证鉴权. 本人测试软硬件环境:Windows10.Eclipse.SpringBoot.JDK1.8 准备工作 第一步:在pom.xml中引入相关依赖 <dependencies> <dep

  • 使用react实现手机号的数据同步显示功能的示例代码

    本文介绍了使用react实现手机号的数据同步显示功能的示例代码,分享给大家,具体如下: 要求如下 输入框输入内容数据长度大于0,展示出预览信息 光标离开关闭预览信息 预览信息每隔4位插入一个特殊字符_,输入内容不变 限制长度为13位 只允许输入数字(0-9) // Zinput.js import React, { Component } from 'react'; import './Zinput.css' // NOTE: 获取焦点事件 原生onFocus 即可 // NOTE: 离开焦点事

  • 使用React-Router实现前端路由鉴权的示例代码

    React-Router 是React生态里面很重要的一环,现在React的单页应用的路由基本都是前端自己管理的,而不像以前是后端路由,React管理路由的库常用的就是就是 React-Router .本文想写一下 React-Router 的使用,但是光介绍API又太平淡了, 而且官方文档已经写得很好了 ,我这里就用一个常见的开发场景来看看 React-Router 是怎么用的吧.而我们一般的系统都会有用户访问权限的限制,某些页面可能需要用户具有一定的权限才能访问.本文就是用 React-Ro

  • SpringBoot中使用Session共享实现分布式部署的示例代码

    前言:我们知道,在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作 但是分布式部署的时候,我们请求的服务器可能不是同一台服务器,那么我们就必须要面对 session 共享的问题,下面介绍的是在 SpringBoot 实现 session 共享的方式 一.创建项目 创建 SpringBoot 项目,选择 Maven 依赖 最终 pom.xml 文件如下: <!-- redis的依赖 -->

  • springboot+redis 实现分布式限流令牌桶的示例代码

    1.前言 网上找了很多redis分布式限流方案,要不就是太大,需要引入第三方jar,而且还无法正常运行,要不就是定时任务定时往key中放入数据,使用的时候调用,严重影响性能,所以着手自定义实现redis令牌桶. 只用到了spring-boot-starter-data-redis包,并且就几行代码. 2.环境准备 a.idea新建springboot项目,引入spring-data-redis包 b.编写令牌桶实现方法RedisLimitExcutor c.测试功能,创建全局拦截器,测试功能 3

  • Spring Data JPA实现持久化存储数据到数据库的示例代码

    目录 1.SpringBoot项目整合JPA 1.1 pom.xml依赖 1.2 application配置文件 2.创建实体类 3.启动项目,测试验证 1.SpringBoot项目整合JPA 1.1 pom.xml依赖 <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &

随机推荐