对input输入框脱敏的实现(input输入时可回删、可粘贴)

news2024/11/16 1:50:34

目录

  • 1.要解决的问题
  • 2.第一回合:substring + replace
  • 3.第二回合:移魂大法
  • 4.第三回合:移花接木
  • 5.第四回合:万佛归宗

写在前面: 如有转载,务必注明出处,否则后果自负。

1.要解决的问题

继续与客户battle,啊不,与input输入框battle!
扶我起来,我还能战。。。

那厮继续以安全性和隐私性为由,说由于登录界面的账号是以身份证号进行登录的,而在输入身份证号时如果全部暴露出来,那是及其不安全的,所以需要隐藏从第11位开始到结尾的数字,如下图:
在这里插入图片描述
首先,快速写一个Demo测试一下:

<style>
	* {
	    margin: 0;
	    padding: 0;
	    box-sizing: border-box;
	}
	.container {
	    width: 300px;
	    padding: 50px 20px;
	    margin: 100px auto;
	    border-radius: 5px;
	    background: #ccc;
	}
	input {
	    width: 100%;
	    height: 40px;
	    padding: 0 10px;
	    outline: none;
	    border: 1px solid #ccc;
	}
</style>
<div class="container">
    <input type="text" id="userName" placeholder="请输入身份证号">
</div>

2.第一回合:substring + replace

可以很自然的想到,使用input监听事件,然后通过substring和replace实现截取和替换。

const inputField = document.querySelector('#userName');
inputField.addEventListener('input', function (e) {
    const inputValue = this.value.trim(); // 获取输入框中的值
    // 判断输入长度是否超过十位数
    if (inputValue.length > 10) {
        // 取前十位可见
        const visiblePart = inputValue.substring(0, 10);
        // 第十位后面的数字用*替换
        const hiddenPart = inputValue.substring(0, inputValue.length - 10).replace(/./g, '*');
        // 组合成脱敏后的值
        const maskedValue = visiblePart + hiddenPart;
        // 更新输入框中的显示值
        this.value = maskedValue;
    }
    console.log('res', this.value);
})

在这里插入图片描述
问题来了: 替换之后,身份证的后12位数字就全部变成了 * 号 ,我们知道,账号密码进行登录时,要把数据传到后端,可是如果使用这个结果传到后端,肯定是登录失败的,因为后端无法识别这个*原来到底是什么数字。

3.第二回合:移魂大法

首先想到,可以使用一个变量realValue记录完整的真实的账号,传递数据给后端时就使用该变量的值进行传递;还要使用变量temp来记录每次输入时当前位数要替换成*的数字,并把该数字添加到realValue变量的末尾。

你该想到,这是不能实现的。因为每次输入时当前位的数字是变化的,即temp是变化的,而变量realValue是由前十位可见数字+temp变量组成的,所以每次realValue最后的输出结果就只有11位数字,且realValue最后一位数字就是temp的值也是最后一次输入的最后一位的数字。如下:

const inputField = document.querySelector('#userName');
// 临时变量,记录当前输入位的数字
let temp = '';
// 完整的真实的身份证号
let realValue = '';
inputField.addEventListener('input', function (e) {
    const inputValue = this.value.trim(); // 获取输入框中的值
    // 判断输入长度是否超过十位数
    if (inputValue.length > 10) {
        // 取前十位可见
        const visiblePart = inputValue.substring(0, 10);
        // 记录当前输入的最后1位数字
        temp = this.value[this.value.length - 1];
        // 记录真实的身份证号:前十位 + 当前输入的最后一位
        realValue = visiblePart + temp;
        // 第十位后面的数字用*替换
        const hiddenPart = inputValue.substring(0, inputValue.length - 10).replace(/./g, '*');
        // 组合成脱敏后的值
        const maskedValue = visiblePart + hiddenPart;
        // 更新输入框中的显示值
        this.value = maskedValue;
    }
    console.log('res', realValue);
})

所以,当我们在页面输入:aaaaaaaaaa200001019999时,最后的结果输出的却是: aaaaaaaaaa9
在这里插入图片描述
在这里插入图片描述
由于有了上次自动填充的思想,我们可以想到,使用一个对于用户不可见的input来记录真实的账号,在传递数据给后端时,就使用该不可见的input的值来进行传递。

于是,代码就变成了如下所示(记得隐藏第二个input输入框):

<style>
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }

    .container {
        width: 300px;
        padding: 50px 20px;
        margin: 100px auto;
        border-radius: 5px;
        background: #ccc;
    }

    input {
        width: 100%;
        height: 40px;
        padding: 0 10px;
        outline: none;
        border: 1px solid #ccc;
    }

    input#realUserName {
        display: none;
    }
</style>
<div class="container">
    <input type="text" id="userName" placeholder="请输入身份证号">
    <input type="text" id="realUserName">
</div>

<script>
    const inputField = document.querySelector('#userName');
    const realUserName = document.querySelector('#realUserName');
    inputField.addEventListener('input', function (e) {
        // 获取输入框中的值
        const inputValue = this.value.trim();

        // 拼接每一次输入的当前数字
        realUserName.value += inputValue.substring(inputValue.length - 1);

        // 判断输入长度是否超过十位数
        if (inputValue.length > 10) {
            // 取前十位可见
            const visiblePart = inputValue.substring(0, 10);
            // 第十位后面的数字用*替换
            const hiddenPart = inputValue.substring(0, inputValue.length - 10).replace(/./g, '*');
            // 组合成脱敏后的值
            const maskedValue = visiblePart + hiddenPart;
            // 更新输入框中的显示值
            this.value = maskedValue;
        }
        console.log('res', this.value, realUserName.value);
    })
</script>

看看效果,
输入:aaaaaaaaaa200001019999,
输出:aaaaaaaaaa200001019999。
至此,基本的脱敏效果就完成了。
在这里插入图片描述
在这里插入图片描述
问题又又来了: 模拟用户输入,如果用户在输入第5位数时,把本该是a的输成了b,于是他使用删除键删除了b进行更正,继续输入正确的账号,那他能正确登录吗?答案是不能。因为我们在记录账号时使用的是简单的拼接,没有做其他的处理,所以就此埋下了bug。

如图,我们输入账号aaaaaaaaaa200001019999,但在此过程中,输入第5位数时由于输入错误,输成了b,并使用删除进行更正,最后输入了正确的账号。但在代码中的输出结果还是含有b的,这就会导致用户登录失败。
输出结果:aaaabaaaaaaa200001019999
在这里插入图片描述
在这里插入图片描述

4.第三回合:移花接木

这个问题有很多解决方法,这里提供一个思路,输入错误时,回退更正之后会导致两个input的值的长度不同,可以在监听事件中判断长度是否相同,如果不同,则是用户出现了回退行为,可以将被隐藏的输入框使用substring截取到与用户的输入框的值长度一致的位置。

// 防止用户回退输入时出现错误
if (inputValue.length != realUserName.value.length) {
    realUserName.value = realUserName.value.substring(0, inputValue.length)
}

注意: substring截取结果不包括结束字符(顾头不顾尾)。

效果展示:
输入:aaaaaaaaaa200001019999
输出:aaaaaaaaaa200001019999
在这里插入图片描述
在这里插入图片描述

问题又又又来了: 如果用户输入账号时,使用鼠标或者键盘进行复制粘贴的输入呢?能登录成功吗?猜对了,不能!

5.第四回合:万佛归宗

当用户输入账号时,如果直接进行复制粘贴,input监听事件只能监听到最后一位数字,这会导致最终的结果只有最后一位数字,从而导致登录失败。这里可以直接使用赋值的方法,将用户的输入框的值直接赋值给被隐藏的输入框。那怎么判断出现了复制粘贴的情况呢?这不是和移花接木里面的情况一样嘛,长度不一样啊,所以知道为什么叫万佛朝宗了吧,直接开大招就是不一样,可以解决99%的问题。
输入:aaaaaaaaaa200001019999
输出:9
在这里插入图片描述
在这里插入图片描述

施展技能,万佛朝宗,返璞归真:

// 防止用户删除上一个输入值时出现错误
// 并且
// 防止用户通过粘贴输入值时只监听到最后一位数而出现的错误
if (inputValue.length != realUserName.value.length) {
    realUserName.value = inputValue;
}

效果展示:
输入:aaaaaaaaaa200001019999
输出:aaaaaaaaaa200001019999

在这里插入图片描述
至此,就完成了对input输入框的脱敏功能。实现脱敏的方法很多,本文仅提供一些思路,如有其他更好的方法,欢迎交流!

另外,若对禁止浏览器的自动填充感兴趣的朋友,欢迎查看我的其他文章,链接地址在下方。里面阐述了对于不同浏览器(谷歌、火狐、Edge)该怎样禁止自动填充的说明,欢迎访问。

文章地址: https://blog.csdn.net/qq_51667621/article/details/139977451

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

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

相关文章

从云原生视角看 AI 原生应用架构的实践

本文核心观点&#xff1a; 基于大模型的 AI 原生应用将越来越多&#xff0c;容器和微服务为代表的云原生技术将加速渗透传统业务。API 是 AI 原生应用的一等公民&#xff0c;并引入了更多流量&#xff0c;催生企业新的生命力和想象空间。AI 原生应用对网关的需求超越了传统的路…

云计算运维工程师的突发状况处理

云计算运维工程师在应对突发的故障和紧急情况时,需要采取一系列迅速而有效的措施来最小化服务中断的时间并恢复系统的稳定性。 以下是一些关键步骤和策略: 快速响应: 立即识别并确认故障的性质和范围。通知团队成员和相关的利益相关者,确保所有人了解当前情况。故障诊断:…

Web Worker 学习及使用

了解什么是 Web Worker 提供了可以在后台线程中运行 js 的方法。可以不占用主线程&#xff0c;不干扰用户界面&#xff0c;可以用来执行复杂、耗时的任务。 在worker中运行的是另一个全局上下文&#xff0c;不能直接获取 Window 全局对象。不同的 worker 可以分为专用和共享&…

使用 Vue Router 的 meta 属性实现多种功能

在 Vue.js 中&#xff0c;Vue Router 提供了强大的路由管理功能。通过 meta 属性&#xff0c;我们可以在路由定义中添加自定义元数据&#xff0c;以实现访问控制、页面标题设置、角色权限管理、页面过渡效果等多种功能。本文将总结如何使用 meta 属性来实现这些常见的功能。 1.…

gici-open学习日记(7):GNSS图优化——RTK

gici-open学习日记——GNSS RTK图优化 前言初始化RTK的调用rearrangePhasesAndCodes双差构造formPhaserangeDDPair周跳探测cycleSlipDetectionSD添加参数块模糊度参数部分addSdAmbiguityParameterBlocks添加双差伪距残差addDdPseudorangeResidualBlocks添加双差相位残差addDdPh…

springcloud-gateway 路由加载流程

问题 Spring Cloud Gateway版本是2.2.9.RELEASE&#xff0c;原本项目中依赖服务自动发现来自动配置路由到微服务的&#xff0c;但是发现将spring.cloud.gateway.discovery.locator.enabledfalse 启动之后Gateway依然会将所有微服务自动注册到路由中&#xff0c;百思不得其解&a…

手把手从零开始搭建远程访问服务

远程访问服务工具——FRP frp 是一个能够实现内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网的服务器来转发。 资源链接 根据自己服务型号和操作系统来选取对应的文件&#xff0c;不知道的…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一&#xff0c;旗下拥有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同时提供汽车金融和高档出行服务。作为一家全球性公司&#xff0c;宝马集团在14个国家拥有31家生产和组装厂&#xff0c;销售网络遍及140多个国家和地区。 本文主…

mitt通信

一、mitt介绍 mitt是一款轻量级的组件通信插件(大小仅为200字节左右) 二、mitt安装 npm install --save mitt三、使用 1.在组件中使用 import mitt from mitt //创建mitt实例 const emitter mitt()// 监听事件 emitter.on(foo, e > console.log(foo, e) )// 通过通配符监…

09. Java ThreadLocal 的使用

1. 前言 本节内容主要是对 ThreadLocal 进行深入的讲解&#xff0c;具体内容点如下&#xff1a; 了解 ThreadLocal 的诞生&#xff0c;以及总体概括&#xff0c;是学习本节知识的基础&#xff1b;了解 ThreadLocal 的作用&#xff0c;从整体层面理解 ThreadLocal 的程序作用&…

VC++开发积累——vc++6.0中删除函数的方法,右键,Delete

目录 引出插曲&#xff1a;删除函数的方法多行注释的实现代码输入的自动提示搜索出来&#xff0c;标记和取消标记跳转到上一步的位置 ctrl TAB 总结其他规范和帮助文档创建第一个Qt程序对象树概念信号signal槽slot自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自…

千呼新零售2.0-OCR拍照识别采购单

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物、中医养生、大健康等连锁店…

Python 实现Excel转TXT,或TXT文本导入Excel

Excel是一种具有强大的数据处理和图表制作功能的电子表格文件&#xff0c;而TXT则是一种简单通用、易于编辑的纯文本文件。将Excel转换为TXT可以帮助我们将复杂的数据表格以文本的形式保存&#xff0c;方便其他程序读取和处理。而将TXT转换为Excel则可以将文本文件中的数据导入…

AI引领创意潮流:高效生成图片,参考图助力,一键保存到指定文件夹

在这个数字与创意交融的时代&#xff0c;我们迎来了AI绘画的新纪元。借助先进的AI技术&#xff0c;我们不仅能够高效生成图片&#xff0c;还能在参考图的启发下&#xff0c;激发无限创意&#xff0c;让您的想象力在数字世界中自由翱翔。 首助编辑高手软件中的魔法智能绘图板块&…

PMP证书在国内已经泛滥了,大家怎么看?

目前&#xff0c;越来越多的人获得了PMP证书。自1999年PMP引入中国以来&#xff0c;全国累计PMP考试人数接近60万人次&#xff0c;通过PMP认证的人数约为42万人。虽然这个数据看起来很大&#xff0c;但绝对不能说是过多。 首先&#xff0c;PMP在中国并不普遍。根据美国项目管理…

解决go语言对接s3的SDK上传文件遇到的问题

先看正确的配置 问题1 配置文件中的OssEndpoint 不管是minio还是oss需要带上http://或者https:// 否则会出现这个问题 operation error S3: PutObject, exceeded maximum number of attempts, 3, https response error StatusCode: 0, RequestID: , HostID: , request send …

qt报错:“QtRunWork”任务返回了 false,但未记录错误。

qt报错&#xff1a;“QtRunWork”任务返回了 false&#xff0c;但未记录错误。 说明情况一 说明 这个报错可能的原因有很多&#xff0c;这里只写一种&#xff0c;以后遇到再进行补充。 情况一 如果 Q_OBJECT 宏未正确处理&#xff0c;通常会出现类似的错误。 要使用信号与槽…

视频汇聚平台LntonCVS视频集中存储平台技术解决方案

安防视频监控技术是一种利用各种监控设备捕捉实时画面&#xff0c;并将其传输至监控中心或数据存储设备的技术。随着科技的不断进步&#xff0c;监控视频技术也在不断改进&#xff0c;应用领域也在不断扩展。 然而&#xff0c;尽管技术进步&#xff0c;当前视频监控技术仍然面临…

PointCloudLib-特征(Features)-全局对齐空间分布 (GASD) 描述符

全局对齐空间分布 (GASD) 描述符 本文档介绍用于高效对象识别和姿势估计的全局对齐空间分布 ([GASD]) 全局描述符。 GASD 基于对表示对象实例的整个点云的参考系的估计,该参考系用于将其与规范坐标系对齐。之后,根据对齐点云的 3D 点的空间分布方式计算对齐点云的描述符…

最新!计算机类SCI期刊全名单!你想发的顶刊都在这里

【SciencePub学术】近日&#xff0c;2023JCR正式发布&#xff0c;最受瞩目就是各类期刊的最新影响因子排名&#xff0c;本期&#xff0c;小编对计算机类的期刊做了一个整理&#xff0c;供计算机方向的研究学者们参考&#xff01; 来源&#xff1a;WOS数据库官网 完整名单 ※ 本…