当前位置: 首页 > news >正文

jquery-validate在前端数据校验中的应用以及remote异步调用实践-以若依为例

目录

前言

一、关于Jquery Validate组件

1、validate是什么

2、内置验证方式及触发方式

3、自定义验证规则 

二、基本验证实战以及Remote验证

1、基本验证实现

2、remote校验方式

三、总结


前言

        随着技术的不断演进,在我们的日常开发过程中,大家一定会遇到很多数据安全的场景。在以往的程序中,我们只要求将数据正常提交到后台即可,对于数据的安全性和准确性,并没有做过多的要求和检验,也因此产生了很多的数据质量问题。比如数据质量有问题,甚至出现一些会导致业务发生异常的例子。不管是传统的单体化架构还是现在的前后端分离架构,数据的校验通常会分为前端和后端处理两个方面。在平时的开发过程中,很多前端的同学会觉得,安全是后端需要考虑的,前端只需要把数据提交给后台即可,那么数据的校验规则由后台来保证。那一些后端的同学则会想,数据的格式校验等操作应该是前言的同学来负责,不经过校验的数据是不允许提交到后台,直接前端就提示给用户,必须按照要求来进行相应参数的设置。

        首先根据不同的开发角色,可能关注点不一样。很多小项目或者小企业,做的并不是那么的正规。安全不是任何一方或者一两种角色就能完全搞定的,而是需要多方协同,多管齐下才能看到效果的。稍微正规一点的开发团队,对于这种数据的校验,通常都会做两遍。首先是前端针对用户的输入会做初步的筛查,将不合格的数据进行第一遍过滤。后端同学同样会按照数据规则在做一次,这么做的目的不是为了重复而重复,而是为了安全。因为前端的数据过滤仅仅能防范60%的攻击,比如针对非专业用户,它不会进行接口扫描和请求信息伪造,也不会进行流量模拟。但是对于专业的黑客或者安全人员,他们是完全可以绕过前端的校验,直接请求后端提供的服务,加入在后端没有任何的拦截,那就是我家大门常打开了,显然这是不合理,也是不正常的。

        本文主要讲解如何在前端的表单提交时,对表单的数据格式进行验证。博客内容以若依技术框架为例,主要讲解在若依的单体架构前端开发过程中,如何集成jQuery Validate这个组件,首先介绍这个组件的内置校验方式,然后介绍一些常见的表单规则的设置,比如非空、邮件地址、手机电话等常规格式的校验,最后介绍需要异步校验的remote模式,在进行表单提交时,如果有异步remote的请求,如何进行数据的拦截,又会面临什么问题等。希望通过本文,您能掌握jQuery Validate的具体集成使用,同时能进行remote的ajax开发,帮助您构建安全可靠的应用系统。

一、关于Jquery Validate组件

        本节首先介绍若依单体架构开发模式中使用得比较多的jQuery Validate组件。通过简单介绍这款组件的基本信息,其提供的内置校验规则,集成原理等让大家对这个组件有一定的了解。

1、validate是什么

jquery-validate插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求。 该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同时提供了一个用来编写用户自定义方法的 API。

        默认校验规则。

属性描述
required:true必须输入的字段
remote:"/action"使用ajax方法调用action验证输入值
email:true必须输入正确格式的电子邮件
url:true必须输入正确格式的网址
date:true必须输入正确格式的日期。日期校验 ie6 出错,慎用
dateISO:true必须输入正确格式的日期(ISO),例如:2009-06-23,1998/01/22。只验证格式,不验证有效性
number:true必须输入合法的数字(负数,小数)
digits:true必须输入整数
creditcard:必须输入合法的信用卡号
equalTo:"#field"输入值必须和 #field 相同
accept:输入拥有合法后缀名的字符串(上传文件的后缀)
maxlength:5输入长度最多是 5 的字符串(汉字算一个字符)
minlength:10输入长度最小是 10 的字符串(汉字算一个字符)
rangelength:[5,10]输入长度必须介于 5 和 10 之间的字符串(汉字算一个字符)
range:[5,10]输入值必须介于 5 和 10 之间
max:5输入值不能大于 5
min:10输入值不能小于 10
isIp:trueIP地址验证
isPhone:true手机号码验证
isTel:true电话号码验证
isName:true姓名验证
isUserName:true用户名验证
isIdentity:true身份证验证
isBirth:true出生日期验证

2、内置验证方式及触发方式

        jquery-validate内置了上面的一些常见验证方式。

required()Boolean必填验证元素
required(dependency-expression)Boolean必填元素依赖于表达式的结果
required(dependency-callback)Boolean必填元素依赖于回调函数的结果
remote(url)Boolean请求远程校验。url 通常是一个远程调用方法
minlength(length)Boolean设置最小长度
maxlength(length)Boolean设置最大长度
rangelength(range)Boolean设置一个长度范围 [min,max]
min(value)Boolean设置最小值
max(value)Boolean设置最大值
email()Boolean验证电子邮箱格式
range(range)Boolean设置值的范围
url()Boolean验证 URL 格式
date()Boolean验证日期格式(类似 30/30/2008 的格式,不验证日期准确性只验证格式)
dateISO()Boolean验证 ISO 类型的日期格式
dateDE()Boolean验证德式的日期格式(29.04.1994 或 1.1.2006)
number()Boolean验证十进制数字(包括小数的)
digits()Boolean验证整数
creditcard()Boolean验证信用卡号
accept(extension)Boolean验证相同后缀名的字符串
equalTo(other)Boolean验证两个输入框的内容是否相同
phoneUS()Boolean验证美式的电话号码

        验证的触发方式修改。

触发方式类型默认值描述
onsubmitBooleantrue提交时验证。设置为 false 就用其他方法去验证
onfocusoutBooleantrue失去焦点时验证(不包括复选框/单选按钮)
onkeyupBooleantrue在 keyup 时验证
onclickBooleantrue在点击复选框和单选按钮时验证
focusInvalidBooleantrue提交表单后,未通过验证的表单(第一个或提交之前获得焦点的未通过验证的表单)会获得焦点
focusCleanupBooleanfalse如果是 true 那么当未通过验证的元素获得焦点时,移除错误提示。避免和 focusInvalid 一起用

3、自定义验证规则 

        虽然验证组件内置了许多默认的验证规则,但是现实当中,我们依然会遇到不满足业务需要的时候,因此校验组件还需要有根据自定义规则来进行扩展的能力。我们来看一下如何在jquery-validate中进行自定义验证规则的扩展。下面以例如加一个区号的验证为例,

1、在jquery.validate.extend.js加入自定义规则

// 地区号码验证
jQuery.validator.addMethod("ac", function (value, element) {var ac = /^0\d{2,3}$/;return this.optional(element) || (ac.test(value));
}, "区号如:010或0371");

2、然后rules中使用ac: true

rules: {areaCode:{ac: true,},
}

        出现如下图表示自定义区号验证成功。

        以上就是关于jquery validate组件的相关介绍,包括其主要功能、内置的验证方式、触发方式以及如何自定义验证规则等。这些知识非常重要,通过本节的介绍,大家对jquery-validate有了一定的了解。 

二、基本验证实战以及Remote验证

        了解和掌握了validate组件的基本知识以后,我们就可以基于这些规则来进行表单的校验。然后来讲解一个远程调用的实战,使用remote来进行城市是否绑定的校验实现。

1、基本验证实现

        如果只是表单的基本验证,在若依提供的基本验证框架中有详细的示例,大家感兴趣可以在其提供的官方实例中进行学习。这里结合自己实现的一个国家及首都城市管理的小应用来讲解基本的使用。在这个小例子当中,需要对国家的起止时间和当前城市是否被其它国家绑定来进行限制。而城市信息属于必填的信息,当前国家是否被其它国家绑定则需要配合后台的校验服务来进行验证。先来看表单的定义,html源码如下所示:

<div class="form-group">    <label class="col-sm-3 control-label is-required">城市信息:</label><input type="hidden" name="placesId" id="placesId"/><div class="col-sm-8"><div class="input-group"><input type="text" id="placesInfo" name="placesInfo" class="form-control" readonly="readonly" required> <span class="input-group-btn"><button type="button" onclick="selectPlaces()" class="btn btn-success"><i class="fa fa-search"></i></button> </span></div></div>
</div>

        首先在表单定义的时候加上一个required的属性,表示当前的表单的元素是必填的设置。 除了在form中定义,还需要使用javascript来创建rule规则,并跟触发机制进行绑定。定义规则的代码如下:

$("#form-capital-add").validate({onkeyup: true,rules:{placesInfo:{remote: {url: prefix + "/checkCapitalUnique?t" + new Date() ,type: "post",dataType: "json",data: {"placesId": function() {return $.common.trim($("#placesId").val());},"countryId":[[${countryId  + "" }]]},dataFilter: function(data, type) {return $.validate.unique(data);}}}},messages: {placesInfo: {remote: "该城市已被管理"}},focusCleanup: true
});

        最后在提交表单的时候触发表单的校验,提交函数定义如下:

function submitHandler() {if ($.validate.form()) {$.operate.save(prefix + "/add", $('#form-capital-add').serialize());}
}

        先来看必填的验证结果,如下图所示:

        以上就是基本表单校验的结果展示。讲解完基本表单验证之后,接下来来介绍一下远程验证方式以及可能存在的问题。

2、remote校验方式

        如果在校验过程中需要对数据进行后台查询的校验,比如查询用户名是否在后台被别人占用,或者查询手机号码是否被使用了等等。这里的场景是当前的城市是否被别的国家所占用。首先我们来实现后台的校验逻辑。查询是否重复的逻辑如下所示,实际业务中大家可以根据自己的场景进行修改。

@Override
public String checkCapitalUnique(CountryCapital capital) {Long countryId = StringUtils.isNull(capital.getCountryId()) ? -1L : capital.getCountryId();QueryWrapper<CountryCapital> queryWrapper = new QueryWrapper<CountryCapital>();queryWrapper.eq("places_id", capital.getPlacesId());CountryCapital info = this.baseMapper.selectOne(queryWrapper);if (StringUtils.isNotNull(info) && info.getCountryId().longValue() != countryId.longValue()){return CapitalConstants.CAPITAL_NOT_UNIQUE;}return CapitalConstants.CAPITAL_UNIQUE;
}

         是否加上以上的功能就可以实现是否占用的校验呢?如果按照这种功能方式实现,你会发现,当我们出现了重复的时候,表单虽然有了校验,但是表单依然进行了提交。如下图所示:

        如果发生这种情况,肯定是不满足业务需要的,因此要求我们进行一定的限制,同时表单不能提交。 那应该怎么做呢?这里不卖关子,直接给出实现方案,在验证的方法中需要将remote方法中的异步开关关掉,改为同步的方式。代码如下图所示:

remote: {url: prefix + "/checkCapitalUnique?t" + new Date() ,type: "post",dataType: "json",async:false,//必须要开启同步模式,否则还是会提交表单data: {"placesId": function() {return $.common.trim($("#placesId").val());},"countryId":[[${countryId  + "" }]]},dataFilter: function(data, type) {return $.validate.unique(data);}
}

        更改以上的异步开关后,我们来看一下最后的实现效果,如下图所示:

        再次点击确定按钮,你会发现校验信息已经成功加上,同时校验不通过的话,表单不会提交,这样就达到了我们的需求。 

三、总结

        以上就是本文的主要内容,本文主要讲解如何在前端的表单提交时,对表单的数据格式进行验证。博客内容以若依技术框架为例,主要讲解在若依的单体架构前端开发过程中,如何集成jQuery Validate这个组件,首先介绍这个组件的内置校验方式,然后介绍一些常见的表单规则的设置,比如非空、邮件地址、手机电话等常规格式的校验,最后介绍需要异步校验的remote模式,在进行表单提交时,如果有异步remote的请求,如何进行数据的拦截,又会面临什么问题等。希望通过本文,您能掌握jQuery Validate的具体集成使用,同时能进行remote的ajax开发,帮助您构建安全可靠的应用系统。行文仓促,定有许多不足之处,如有不足还恳请各位专家朋友在评论区不吝指出,不胜感激。

相关文章:

jquery-validate在前端数据校验中的应用以及remote异步调用实践-以若依为例

目录 前言 一、关于Jquery Validate组件 1、validate是什么 2、内置验证方式及触发方式 3、自定义验证规则 二、基本验证实战以及Remote验证 1、基本验证实现 2、remote校验方式 三、总结 前言 随着技术的不断演进&#xff0c;在我们的日常开发过程中&#xff0c;大家一…...

如何重新设置VSCode的密钥环密码?

故障现象&#xff1a; 忘记了Vscode的这个密码&#xff1a; Enter password to unlock An application wants access to the keyring “Default ke... Password: The unlock password was incorrect Cancel Unlock 解决办法&#xff1a; 1.任意terminal下&#xff0c;输入如下…...

Android--java实现手机亮度控制

文章目录 1、开发需求2、运行环境3、主要文件4、布局文件信息5、手机界面控制代码6、debug 1、开发需求 需求&#xff1a;开发一个Android apk实现手机亮度控制 2、运行环境 Android studio最新版本 3、主要文件 app\src\main\AndroidManifest.xml app\src\main\res\layou…...

原点安全再次入选信通院 2024 大数据“星河”案例

近日&#xff0c;中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织开展的 2024 大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…...

torch.nn.init 模块介绍

PyTorch 的 torch.nn.init 模块提供了一组用于初始化张量或模型参数的函数。这些初始化方法对深度学习模型的训练收敛速度和性能有显著影响,正确选择初始化方法可以避免梯度消失或爆炸等问题。 模块功能 torch.nn.init 提供了一系列函数,用于对张量(如权重或偏置)进行初始…...

人工智能与物联网:从智慧家居到智能城市的未来蓝图

引言&#xff1a;未来已来&#xff0c;智能化的世界 想象一下&#xff0c;一个早晨&#xff0c;智能闹钟根据你的睡眠状态自动调整叫醒时间&#xff0c;咖啡机早已备好热腾腾的咖啡&#xff0c;窗帘缓缓拉开&#xff0c;迎接清晨的阳光。这不是科幻小说中的场景&#xff0c;而是…...

极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

纯Dart Flutter库适配HarmonyOS

纯Dart Flutter库适配HarmonyOS介绍&#xff1a; Flutter基本组件、Flutter布局组件、Flutter图片组件、Flutter字体、Flutter图标、Fluter路由、flutter动画、 Flutter表单、flutter异步等&#xff0c;纯Dart库无需任何处理&#xff0c;可以直接编译成HarmonyOs应用。 具体步…...

【R语言遥感技术】“R+遥感”的水环境综合评价方法

R语言在遥感领域中是一个强大的工具&#xff0c;它提供了一系列的功能和优势&#xff0c;使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用&#xff1a; 数据处理&#xff1a;R语言可以处理和清洗遥感数据&#xff0c;包括数据转换、滤波处理、去噪和数…...

软件工程三 需求获取与结构化分析方法(需求分析、功能建模、数据建模、行为建模、数据字典等)

包括内容如下&#xff1a; 1. 需求获取与需求分析阶段的任务 2. 结构化分析方法 3. 系统需求规格说明 4. 需求评审 5. 需求管理 3.1 需求获取与需求分析阶段的任务 3.1包括&#xff1a; 需求获取的任务和原则 需求获取的过程 软件需求分析阶段的任务 3.1.1需求获取的任…...

Python 抽象基类 ABC :从实践到优雅

今天我们来聊聊 Python 中的抽象基类&#xff08;Abstract Base Class&#xff0c;简称 ABC&#xff09;。虽然这个概念在 Python 中已经存在很久了&#xff0c;但在日常开发中&#xff0c;很多人可能用得并不多&#xff0c;或者用得不够优雅。 让我们从一个实际场景开始&…...

Elasticsearch检索方案之一:使用from+size实现分页

前面两篇文章介绍了elasticsearch以及Kibana的安装&#xff0c;检索引擎以及可视化工具都已经安装完成&#xff0c;接下来介绍下如何使用golang的sdk实现简单的分页查询。 1、下载Elastic官方golang sdk 在讲解elasticsearch检索之前&#xff0c;需要先把golang的环境安装好&…...

知识图谱+大模型:打造全新智慧城市底层架构

在数字化时代&#xff0c;智慧城市的建设正迎来新一轮的变革。本文将探讨如何结合知识图谱和大模型技术&#xff0c;构建智慧城市的全新底层架构&#xff0c;以应对日益增长的数据量和复杂性&#xff0c;提升城市管理的智能化水平。 知识图谱&#xff1a;智慧城市的知识库 知识…...

Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用

Flutter开发HarmonyOS的好处&#xff1a; Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发…...

vscode安装fortran插件配置

本章教程,主要介绍如何在vscode上安装fortran插件,以便于使用vscode运行fortran编写的程序。 一、安装插件 首先在插件商店安装这个扩展插件 然后再把Code Runner扩展插件装上 二、下载mingw64 通过网盘分享的文件:mingw64 链接: https://pan.baidu.com/s/1fwS-CwC7dgI...

容器化平台Docker初识

Docker 是一个容器化平台&#xff0c;可以让你打包、分发和运行应用程序。它的核心思想是通过容器技术&#xff0c;让应用程序在任何环境下都能以一致的方式运行。 通俗易懂的理解 快餐盒的比喻&#xff1a; 假设你做了一顿饭&#xff08;开发了一个应用程序&#xff09;&#…...

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;该程序需输入个人数据&#xff0c;进而预测其成年后的身高。 相关知识 为了完成本…...

简单两步使用ssh配置内网穿透

解决问题&#xff1a;内网主机没有公网IP&#xff0c;无法从外网登录 流程 首先去阿里云租一台最便宜的服务器作为中转服务器 登录中转服务器(cloudserver) ssh [cloudserver] # 开放对应中转服务 ufw allow [remote_port] #remote_port 2222 vim /etc/ssh/sshd_config将对…...

M系列芯片切换镜像源并安装 openJDK17

1. 查找openjdk版本 执行&#xff1a;brew search openjdk&#xff0c;注意&#xff1a;执行命令后&#xff0c;如果得到的结果中没有红框内容&#xff0c;则需要更新一下 brew 更新 brew 分别执行以下命令&#xff1a; cd "$(brew --repo)" export HOMEBREW_API_D…...

图像处理-Ch6-彩色图像处理

Ch6 彩色图像处理 无广告更易阅读&#xff0c;个人博客点此进入<– 文章目录 Ch6 彩色图像处理彩色基础彩色模型(Color models)RGB(red, green, blue)CMY & CMYK(cyan, magenta, yellow/and black)HSI(hue, saturation, intensity)HSV(hue, saturation, value) 颜色空…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...