Vue 针对浏览器参数过长实现浏览器参数加密解密

 1、首先安装crypto-js

npm install crypto-js 

1、在router/index.js中添加如下代码

在utils工具类添加如下

 encryption.js源码


import CryptoJS from 'crypto-js'
import CryptoJSCore from 'crypto-js/core'
import AES from 'crypto-js/aes'
import ZeroPadding from 'crypto-js/pad-zeropadding'
import Utf8, { parse } from 'crypto-js/enc-utf8'
import Base64 from 'crypto-js/enc-base64'/** 加密 解密*/
const keyHex = parse('1234567890123456') // 十六位数作为密钥,自行修改
const ivHex = CryptoJS.lib.WordArray.random(128 / 8) // 十六位数作为密钥偏移量 随机生成/*** 加密* @param {String} key* @returns {string}*/
// 加密后的结果通常是一个CipherParams对象,其中包含了加密后的密文数据,而密文数据本身是一个WordArray对象。同样,在解密过程中,解密后的结果也是一个WordArray对象。
export const getEncrypt = (key) => {try {key = JSON.stringify(key)} catch (e) {console.warn(e)}//   key需要是WordArray类型return JSON.stringify({encrypt: AES.encrypt(key, keyHex, {mode: CryptoJSCore.mode.CBC,padding: ZeroPadding,iv: ivHex,}).toString(),iv: ivHex,})
}/*** 加密后转base64* @param {String}} key*/
export const getEncryptToBase64 = (key) => {const encryptStr = getEncrypt(key)const wordArray = Utf8.parse(encryptStr) //转为WordArray对象return Base64.stringify(wordArray)
}/*** 解密* @param data* @returns {string}*/
export const getDecrypt = (data) => {let { encrypt, iv } = JSON.parse(data)let decrypted = AES.decrypt({ciphertext: Base64.parse(encrypt),},keyHex,{mode: CryptoJSCore.mode.CBC,padding: ZeroPadding,iv: iv,}).toString(Utf8) //转换为指定编码的字符串try {decrypted = JSON.parse(decrypted)} catch (e) {console.warn(e)}return decrypted
}/*** 对base64数据解密  先解析base64,在做解密* @param {String} data* @returns {string}*/
export const getDecryptByBase64 = (data) => {// 将Base64字符串转换为WordArrayconst parsedWordArray = Base64.parse(data)//   WordArray对象转换成一个UTF-8编码的字符串const decryptStr = Utf8.stringify(parsedWordArray)return getDecrypt(decryptStr)
}

query.js源码

import {getEncryptToBase64 as encrypt,getDecryptByBase64 as decrypt,
} from './encryption'
const encodeReserveRE = /[!'()*]/g
const encodeReserveReplacer = (c) => '%' + c.charCodeAt(0).toString(16) //获取该字符的 ASCII 码值,再将其转换为十六进制字符串,并在前面加上 '%' 作为替换后的结果
const commaRE = /%2C/g //英文逗号处理const encode = (str) =>encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ',')const decode = decodeURIComponent/*** 判断字符串是否是base64* @param { string } str* @returns { boolean }*/
function isBase64(str) {// 检查字符串是否为空或仅包含空白字符if (!str || str.trim() === '') {return false}// 正则表达式匹配Base64的字符集,允许末尾有0-2个等号用于填充const base64Pattern = /^[A-Za-z0-9+/]*={0,2}$/// 首先检查字符串是否符合Base64的字符集规范if (!base64Pattern.test(str)) {return false}try {return btoa(atob(str)) === str} catch (err) {return false}
}function subString(data) {return data.length > 32 ? data.substring(0, 32) : data
}/*** 序列化对象 并加密* @param {Object} obj*/
export const stringifyQuery = (obj) => {const res = obj? Object.keys(obj).map((key) => {const val = obj[key]if (val === null || val === undefined) {return encode(key)}if (Array.isArray(val)) {const result = []val.forEach((val2) => {if (val2 === null || val2 === undefined) {result.push(encode(key))} else {result.push(encode(key) + '=' + encode(val2))}})return result.join('&')}return encode(key) + '=' + encode(val)}).join('&'): nullreturn res ? `?${subString(encrypt(res))}` : ''
}/*** 解密  反序列化字符串参数* @param {String}} query*/
export const parseQuery = (query) => {const res = {}query = query.trim().replace(/^(\?|#|&)/, '')if (!query) {return res}// 解密query = isBase64(query) ? decrypt(query) : queryquery.split('&').forEach((param) => {const parts = param.split('=')const key = decode(parts.shift())const val = parts.length > 0 ? decode(parts.join('')) : nullif (res[key] === undefined) {res[key] = val} else if (Array.isArray(res[key])) {res[key].push(val)} else {// 复原数组res[key] = [res[key], val]}})return res
}

 

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

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

相关文章

antdesignvue vue3全局loading

这里封装为loading.js文件,代码赋值即可用 import { createApp, h } from vue import { Spin } from ant-design-vuelet instance null// 定义全屏遮罩样式 const style {position: fixed,left: 0,top: 0,width: 100%,height: 100%,display: flex,justifyContent…

WPF的一些控件的触发事件记录

<c1:C1ComboBox Width"230" ItemsSource"{Binding ReplaceWayList}" Style"{StaticResource ListSearch-C1ComboBox}" SelectedValueChanged"C1ComboBox_SelectedValueChanged"&#xff0c; 下拉框事件&#xff0c;SelectedValu…

设计模式-创建型设计模式总结

创建型设计模式&#xff08;Creational Design Patterns&#xff09;是 设计模式 中的一类&#xff0c;专注于如何实例化对象或类。它们提供了一些优雅的方式来创建对象&#xff0c;允许程序在对象创建过程中更灵活地进行管理&#xff0c;从而提高系统的扩展性和维护性。 创建…

Transformer算法实现IMDB文本分类任务和WMT14机器翻译任务

Transformer算法详解与PyTorch实现 目录 Transformer算法详解与PyTorch实现1. Transformer算法简介1.1 Transformer的优势1.2 Transformer的应用场景2. Transformer的核心组件2.1 自注意力机制(Self-Attention)2.2 多头注意力机制(Multi-Head Attention)2.3 位置编码(Posi…

Python脚本实现通过Vector VN1630A CAN盒子与ECU通信

1 安装 python-can 包 安装命令如下&#xff1a; pip install python-can安装完成后可用下面命令查看是否安装成功及版本。 pip show python-canName: python-can Version: 4.4.2 Summary: Controller Area Network interface module for Python Home-page: https://github.…

React虚拟DOM:理解和应用

写在前面 在现代前端开发中&#xff0c;React 是一个非常流行的 JavaScript 库&#xff0c;用于构建用户界面。它引入了一个名为“虚拟 DOM”&#xff08;Virtual DOM&#xff09;的概念&#xff0c;这个概念对于 React 的高效性能和易用性至关重要。本文将深入探讨 React Vir…

VSCode 插件全解析:解锁编码新维度

文章目录 前言一、插件的重要性二、插件分类三、创建自己的插件结语 前言 Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费开源文本编辑器&#xff0c;支持多种编程语言和各种扩展插件。它以其轻量级、跨平台和强大的可定制性而闻名&#xff0c…

Oracle 创建本地用户,授予权限,创建表并插入数据

目录 一. 用户的种类二. 切换session为PDB三. 创建用户并授予权限四. 创建表空间五. 为用户分配默认表空间并指定表空间配额六. 通过创建的用户进行登录七. 创建脚本&#xff0c;简化登录八. 查看用户信息九. 创建表&#xff0c;并插入数据9.1 查看当前用户的schema9.2 插入数据…

普及组集训数据结构--并查集

P1551 亲戚 - 洛谷 | 计算机科学教育新生态 并查集就是把所有相关联的量串成一串珠子&#xff0c;抽象来说就是&#xff1a; 把此类相关联的量当作节点&#xff0c;两个节点之间连接一条无向边&#xff0c;所形成的图 例题算法流程&#xff1a; 在此定义“族长”就是一个树的…

pytorch张量高级索引介绍

PyTorch 中&#xff0c;张量索引操作可以使用高级索引&#xff08;advanced indexing&#xff09;&#xff0c;其中索引可以是另一个张量。使用这种索引方式时&#xff0c;返回值的维度由索引张量的形状和原始张量的形状共同决定。以下是具体的规则和解释&#xff1a; 1. 基本…

ESP32-S3遇见OpenAI:OpenAI官方发布ESP32嵌入式实时RTC SDK

目录 OpenAI RTC SDK简介应用场景详解智能家居控制系统个人健康助手教育玩具 技术亮点解析低功耗设计快速响应高精度RTC安全性保障开发者指南 最近&#xff0c;OpenAI官方发布了一款针对ESP32-S3的嵌入式实时RTC&#xff08;实时时钟&#xff09;SDK&#xff0c;这标志着ESP32-…

JS基础 -- 数组 (对象 / 数组 / 类数组 / 对象数组)的遍历

一、数组&#xff1a; 数组是复杂数据类型&#xff0c;用于存储一组有序的数据。 1、创建数组&#xff1a; ① 使用 new 关键字&#xff1a; let arr new Array() // 创建一个长度为0的空数组 let arrLength new Array(5) // 创建一个长度为5的空数组② 字面量形式&#…

【期末复习】一、操作系统概论

题型 选择题 论述题 综合分析题(计算,证明) 算法分析题(根据程序代码分析) 1.方面 操作系统在计算机系统中主要涉及硬件、软件和数据这三个重要方面。 2.操作系统发展历史 手工操作阶段(1940s) 联机批处理系统阶段(1950s) 脱机批处理系统阶段(1950s) 多道…

基于STM32F103的USART的原理及应用(一)(实现手机BLE和MCU进行通信)

一&#xff0c;查阅数据手册&#xff0c;找到对应的IO口和外设总线并配置好外设源文件 想了解USART的具体原理的小伙伴请进传送门&#xff1a;&#xff08;总结&#xff09;STM32中USART原理及应用&#xff08;PC、BLE、ESP8266通信实现&#xff09;-CSDN博客 二&#xff0c;打…

如何在Java开发中选择适合的高性能工具库?

如何在Java开发中选择适合的高性能工具库&#xff1f; 在 Java 开发中选择适合的高性能工具库需要综合考虑多个因素&#xff0c;以下是详细的步骤和要点&#xff1a; 一、明确项目需求 功能需求 首先要确定项目需要的功能。例如&#xff0c;如果主要是进行 JSON 数据处理&a…

2025 小模型技术:驱动低代码与物联网融合发展新引擎

在科技的前沿赛道上&#xff0c;我们满怀期待地迈向 2025 年。这一年&#xff0c;小模型技术宛如一颗璀璨的新星&#xff0c;将在低代码与物联网的浩瀚星空中闪耀出独特光芒&#xff0c;成为引领二者融合发展的强劲引擎&#xff0c;为各行业的数字化变革带来澎湃动力与无限可能…

业务模型与UI设计

业务数据模型的设计、UI设计这应该是程序设计中不可缺少的部分。做程序设计的前提应该先把这两块设计好&#xff0c;那么&#xff0c;来一个实际案例&#xff0c;看看这2块的内容。 汽车保养记录业务模型与UI设计&#xff1a; 一、【车辆清单】 记录车辆相关的数据&#xff0…

微服务保护—Sentinel快速入门+微服务整合 示例: 黑马商城

1.微服务保护 微服务保护是确保微服务架构可靠、稳定和安全的策略与技术。 在可靠性上&#xff0c;限流是控制进入微服务的请求数量&#xff0c;防止流量过大导致服务崩溃。比如电商促销时对商品详情服务进行流量限制。熔断是当被调用的微服务故障过多或响应过慢时&#xff0c;…

unity学习4:git和SVN的使用差别

目录 1 svn 1.1 操作逻辑 1.2 对应工具 1.3 SVN避免冲突的好习惯 2 git 2.1 git的基础操作逻辑 2.1.1 commit时&#xff0c;提交文件之外的其他文件需要pull 2.1.2 commit时&#xff0c;发现要提交的本地文件和服务器的文件冲突了 2.1.3 pull 时 2.2 对应工具 2.3 …

Docker新手:在tencent云上实现Python服务打包到容器

1 使用docker的原因 一致性和可移植性&#xff1a;Docker 容器可以在任何支持 Docker 的环境中运行&#xff0c;无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致&#xff0c;减少了“在我的机器上可以运行”的问题。 隔离性&#xff…