Input类中常用的验证方式
Deolin一般将Input类对象作为POST请求方法的参数,
Input类的域与前端的数据结构一一对应,由于后端不应该相信前端传过来的任何数据,
所以前端的数据对象先绑定到Input对象中,通过JSR303做一次数据校验。
Input类的所有域,类型都是String,
1、不相信前端传来的数据,所以不用诸如Integer,java.util.Date类型的域。不然会出现ClassClassCastException。
2、String类型的域可以添加@Pattern的注解,保证Input对象的每一个域,都能顺利的转化为业务上对应的类型。
Input类
@NotBlank(message = "ID为空")
@Size(max = 11, message = "ID长度超过11")
@Pattern(regexp = "[0-9]+", message = "ID中有非数字")
private String id;
业务上的整数类型
@NotBlank
@Size(max = 500, message = "地址长度超过500字符")
private String address;
长文本
@NotBlank
@Size(max = 20)
@Pattern(regexp = "[0-9\\-]+")
private String telno;
手机号(这个正则可能不是最合适的)
@NotBlank
@Pattern(regexp = "^true$|^false$", 不可用标识不是true且不是false)
private String disableFlag;
逻辑值
@NotBlank
@Pattern(regexp = "^\d{1,8}(\.\d{1,2})*$", message = "单价格式错误(整数长度超过8个数字,或小数长度超过2个数字,或不是数字格式)")
private String price;
价格(最高价是99999999.99)
@NotBlank
@Pattern (regexp = "^([01][0-9]|2[0-3]):([0-5][0-9])$", message = "格式不是HH:mm")
private String breakfastTime;
时间(24小时制,长度不是5位 错误,全角冒号 错误)
控制器共用方法
package com.women.ordering.common; /**
* 封装了控制器的共用方法<br>
*
* @author Deolin
*/
abstract public class Controller { private static final Logger LOG = LogManager.getLogger(Controller.class); /**
* 检查前端提交的数据对象
*
* @param checker JSR303检验结果的封装对象
* @throws InputException 存在任何的异常数据
*/
protected void checkInput(BindingResult checker) {
List<ObjectError> errors = checker.getAllErrors();
StringBuilder messages = new StringBuilder(400);
if (errors.size() > 0) {
for (ObjectError error : errors) {
messages.append(error.getDefaultMessage());
}
LOG.warn("有异常数据越过前端校验:" + messages);
throw new InputException(messages.toString());
}
} }
示例
/**
* 前端
*/
var jsonObj = {'id':'1aaa4', 'price':'10.999'};
$.ajax({
type : "post",
url : "/test",
dataType : "json",
contentType : "application/json",
data : JSON.stringify(jsonObj),
success:function(back) {
if (back.result) {
alert("success");
} else {
alert(back.message);
}
},
error:function(back) {
alert('error');
}
});
/**
* 后端
*/
@Controller
public class TestController extends Controller { @RequestMapping(value = "test", method = RequestMethod.POST)
@ResponseBody
public RequestResult test(@RequestBody ProductInput input, BindingResult checker) {
try {
checkInput(checker);
// TODO 业务代码
return "success";
} catch (Exception e) {
return e.getMessage();
};
} }
Input类中常用的验证方式的更多相关文章
- WCF中常用的binding方式
WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务.WSHttpBinding: 比 Basi ...
- WCF中常用的binding方式 z
WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务. WSHttpBinding: 比 Bas ...
- Azure Service Bus 中的身份验证方式 Shared Access Signature
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- NAND Flash中常用的纠错方式(ECC算法)
Hanming,RS,BCH —— NAND Flash中常用的纠错方式 因为闪存中会有出错的可能,如果没有使用ECC模块,读出的数据和写入的数据会有不匹配的可能,也许一个文件中只有一两个bit不匹配 ...
- 基础篇:1.JavaScript运行在html中,引用有几种方式?—— 6.js中常用的输出方式?
书接上文,上文提到若干条JavaScript的基础性知识,大部分都是一些概念性的东西,本着认真严谨的态度,我们要认真对待,有些条目的问题是某个知识点的周边延伸,为节约篇幅,就一起整理了,如有描述不对的 ...
- php面向对象类中常用的魔术方法
php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct( ...
- 第8.34节 《Python类中常用的特殊变量和方法》总结
本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...
- 第8章 Python类中常用的特殊变量和方法目录
第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...
- String类中常用的操作
一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...
随机推荐
- linux环境,hidraw设备自动加载时默认权限的设置方法
在linux系统中,hidraw设备会自动加载并设置默认权限,但系统的默认只允许root用户访问,普通用户是不允许读写. 设置的方法是修改udev的配置,配置路径是/etc/udev/rules.d/ ...
- 1-JavaScript变量
对于JS的变量这个环节,其实主要要了解一下JS数据类型的存储方法 JS有两种不同的数据类型:基本类型(原始类型),引用类型(对象类型). 1.栈 (stack) 和 堆 (heap) 栈 (stack ...
- javascript之ECMAScript:语法的操作标准
一.如何书写一个javascript代码 javascript代码需要写在javascript标签中才会生效,而javascript标签可以写在任何地方,但考虑到规范化及页面的加载问题,最好是写在bo ...
- 【深度学习】基于Pytorch的ResNet实现
目录 1. ResNet理论 2. pytorch实现 2.1 基础卷积 2.2 模块 2.3 使用ResNet模块进行迁移学习 1. ResNet理论 论文:https://arxiv.org/pd ...
- ERROR: Cannot uninstall 'wrapt'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
pip install imagededup 时,报错:Cannot uninstall 'wrapt'. It is a distutils installed project and thus w ...
- jmeter+jenkins 配置过程(很详细)
一.安装jmeter 第一步 安装JDK,配置JDK路径.注:jdk下载地址,推荐使用jdk1.8版本 http://www.oracle.com/technetwork/java/javase/d ...
- 文件读写(二)利用SteamReader和StreamWrite类处理字符串、FileSystemWatcher、BinaryReader/BinaryWriter
一.读写类: TextReader/TextWriter:文本读写,抽象类 TextReader,其派生类: StreamReader:以一种特定的编码从字节流中读取字符. StringReader: ...
- 创建型模式(一) 单例模式(Singleton)
一.动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只 ...
- CF C. Vladik and fractions——构造题
题目 构造一组 $x, y, z$,使得对于给定的 $n$,满足 $\frac{1}{x} + \frac{1}{y} + \frac{1}{z} = \frac{2}{n}$. 分析: 样例二已 ...
- GIT的创建和使用
1.创建git文件模式 https://www.cnblogs.com/wupeiqi/p/7295372.html 参考地址 先看这个 初始化仓库 git init 在本地新建一个rep ...