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

news2025/1/3 10:26:28

目录

前言

一、关于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开发,帮助您构建安全可靠的应用系统。行文仓促,定有许多不足之处,如有不足还恳请各位专家朋友在评论区不吝指出,不胜感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

连锁餐饮行业数据可视化分析方案

引言 随着连锁餐饮行业的迅速发展&#xff0c;市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势&#xff0c;以制定科学合理的决策&#xff0c;提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据&#xff0c;通过直观、动态的可…

WPF 样式

WPF 有自己的样式设置系统&#xff0c;也自带类似 Winform 的默认样式。默认样式比较一般&#xff0c;我们可以使用下面几种方式自定义好看的 wpf 样式。 1. 本地直接设置 比如更改按钮的背景色和字体颜色&#xff0c; <Grid><StackPanel Orientation"Horizon…

RabbitMQ实现生产者消费者

一.启动MQ 注意管理员身份进入cmd才行,我这里是在本地安装的MQ,推荐使用虚拟机安装 二.思路 官方解释RabbitMQ结构: 自我理解RabbitMQ结构: 其实RabbitMQ的服务器就像邮局一样,我们的生产者和消费者对于这个服务器来说都是消费者,因为服务器都可以向两者发送消息 环境准备 …

虚拟机用网线连其他设备(ROS多机网络配置)

电脑配置 把局域网的网线插入电脑&#xff0c;点击这边 配置以太网的IP 比如说我ROS主机的IP想设为192.168.144.10&#xff0c;那我笔记本的以太网IP可以设为192.168.144.8。 假设还有另外一个电脑&#xff08;ROS从机&#xff09;&#xff0c;他的IP被设置未192.168.144.4…

VIM: Vision Mamba基于双向状态空间模型的高效视觉表示学习

这篇文章的主要内容可以概括如下&#xff1a; 背景与动机&#xff1a; 近年来&#xff0c;状态空间模型&#xff08;SSM&#xff09;在长序列建模中展现出巨大潜力&#xff0c;尤其是Mamba模型在硬件感知设计上的高效性。 然而&#xff0c;现有的SSM模型在处理视觉数据时面临…

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog&#xff08;1&#xff09;修改MySql配置文件&#xff08;2&#xff09;重启MySql服务,查看配置是否生效&#xff08;3&#xff09;配置起效果后&#xff0c;创建canal用户&#xff0c;并赋予权限安装canal-admin&#xff08;1&#xff09;解压 canal.admin-1…

tokenizer、tokenizer.encode、tokenizer.encode_plus比较

一、概念 在我们使用Transformers库进行自然语言处理任务建模的过程中&#xff0c;基本离不开Tokenizer类。我们需要这些Tokenizer类来帮助我们加载预训练模型的分词模块&#xff0c;并将文本转化为预训练模型可接受的输入格式。 而在实际建模的实践中&#xff0c;我们参考优秀…

基于深度学习(HyperLPR3框架)的中文车牌识别系统-搭建开发环境

本篇内容为搭建开发环境。包括&#xff1a;python开发环境&#xff0c;Qt/C开发环境&#xff0c;以及用到的各个库的安装和配置。 一、Python开发环境搭建与配置 1、下载并安装Anaconda 我没有用最新的版本&#xff0c;安装的是 Anaconda3-2021.05-Windows-x86_64.exe&#…

Secured Finance 与 Parasail 在流动性质押领域开展合作

Secured Finance 宣布与 Parasail 达成战略合作&#xff0c;标志着生态在推进 DePIN 及人工智能生态系统能力的重要里程碑。此次合作将 Parasail 卓越的质押方案与 Secured Finance 在去中心化贷款和稳定币协议方面的专业能力相结合&#xff0c;为 Filecoin 生态系统内的创新金…

计算机网络 (8)物理层的传输方式

一、串行传输与并行传输 串行传输 定义&#xff1a;串行传输是一种数据传输方式&#xff0c;指的是逐位地按照顺序传输数据。在串行传输中&#xff0c;数据位逐个按照一定的顺序进行传输&#xff0c;可以通过单条线路或信道进行。特点&#xff1a; 逐位传输&#xff1a;串行传输…

LabVIEW 中 NI Vision 模块的IMAQ Create VI

IMAQ Create VI 是 LabVIEW 中 NI Vision 模块&#xff08;NI Vision Development Module&#xff09;的一个常用 VI&#xff0c;用于创建一个图像变量。该图像变量可以存储和操作图像数据&#xff0c;是图像处理任务的基础。 ​ 通过以上操作&#xff0c;IMAQ Create VI 是构建…

第 29 章 - ES 源码篇 - 网络 IO 模型及其实现概述

前言 本文介绍了 ES 使用的网络模型&#xff0c;并介绍 transport&#xff0c;http 接收、响应请求的代码入口。 网络 IO 模型 Node 在初始化的时候&#xff0c;会创建网络模块。网络模块会加载 Netty4Plugin plugin。 而后由 Netty4Plugin 创建对应的 transports&#xff0…

【Spring MVC 核心机制】核心组件和工作流程解析

在 Web 应用开发中&#xff0c;处理用户请求的逻辑常常会涉及到路径匹配、请求分发、视图渲染等多个环节。Spring MVC 作为一款强大的 Web 框架&#xff0c;将这些复杂的操作高度抽象化&#xff0c;通过组件协作简化了开发者的工作。 无论是处理表单请求、生成动态页面&#x…

模型选择+过拟合欠拟合

训练误差和泛化误差 训练误差&#xff1a;模型在训练数据上的误差 泛化误差&#xff1a;模型在新数据上的误差 验证数据集&#xff1a;一个用来评估模型好坏的数据集 例如拿出50%的数据作为训练 测试数据集&#xff1a;只能用一次 K则交叉验证 在没有足够数据时使用 算法…

计算机网络-L2TP Over IPSec基础实验

一、概述 上次我们进行了标准L2TP的配置&#xff0c;但是在最后我们在进行业务流量访问时看到流量是没有进行加密的&#xff0c;这就导致可能得安全风险&#xff0c;所以这里其实可以退像GRE那样调用IPSec框架来进行加密保护。 拓扑 数据不加密 现在需要配置IPSec&#xff0c;然…

fiscoBcos一键部署webase平台

一键部署webase平台 一键部署可以在同机快速搭建WeBASE管理台环境&#xff0c;方便用户快速体验WeBASE管理平台 一键部署会搭建&#xff1a;节点&#xff08;FISCO-BCOS 2.0&#xff09;、管理平台&#xff08;WeBASE-Web&#xff09;、节点管理子系统&#xff08;WeBASE-Nod…

论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试

大语言模型拥有的强大能力可以用来辅助多种工作&#xff0c;但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz&#xff0c;它利用模型提示生成模糊测试驱动代码&#xff0c;并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…

实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

QT集成IntelRealSense双目摄像头3,3D显示

前两篇文章&#xff0c;介绍了如何继承intel realsense相机和opengl。 这里介绍如何给深度数据和色彩数据一块显示到opengl里面。 首先&#xff0c;需要了解深度数据和彩色数据是如何存储的。先说彩色数据。彩色图像一般都是RGB&#xff0c;也就是每个像素有三个字节&#xf…

PHP框架+gatewayworker实现在线1对1聊天--gatewayworker说明(2)

文章目录 gatewayworker使用说明onConnect 说明 gatewayworker使用说明 gatewayworker里只需要使用Applications\YourApp下的Events.php文件。 对文件的代码进行一下改造&#xff0c;如下&#xff0c;我们只需要用到onConnect方法&#xff0c;写法固定&#xff0c;其他方法都…