【前端】2024年 前端Base64编码的中文处理问题
window.btoa() 遇到中文要出问题
localStorage.setItem("token",window.btoa(unescape(encodeURIComponent(UDATA["uid"]+"#START_AC#"+UDATA["uaccount"]+"#END_AC#"+"#START_TIME#"+time+"#END_TIME#"+"#START_SF#"+UDATA['usf']+"#END_SF#"))))
由于unescape过时了 就换一种写法,如下(下方的写法需要浏览器支持)
编码
const onFinish = values => {
console.log("values", values)
user_login(formState).then((res) => {
let code = res["code"]
let msg = res["message"]
notification.open({
message: '通知',
description: msg,
icon: () =>
h(SmileOutlined, {
style: 'color: #108ee9',
}),
});
if (code === 1) {
console.log(res["data"])
let UDATA = res["data"]
//账号状态判断
if (UDATA["status"] !== "正常") {
notification.open({
message: '通知',
description: "账号异常,已被停止使用,请联系管理员重试",
icon: () =>
h(SmileOutlined, {
style: 'color: #108ee9',
}),
});
return
}
let time = parseInt(new Date().getTime() / 1000) + ''
localStorage.setItem("username", UDATA["uname"])
localStorage.setItem("account", UDATA["uaccount"])
// 拼接字符串
let dataString = UDATA["uid"] + "#START_AC#" + UDATA["uaccount"] + "#END_AC#" +
"#START_TIME#" + time + "#END_TIME#" +
"#START_SF#" + UDATA['usf'] + "#END_SF#";
// 使用 TextEncoder 进行 UTF-8 编码
const encoder = new TextEncoder();
const dataUint8Array = encoder.encode(dataString);
// 将 Uint8Array 转换为 Base64
localStorage.setItem("token", btoa(Array.from(dataUint8Array, byte => String.fromCharCode(byte)).join('')));
router.push("/index")
}
})
};
关键代码
// 拼接字符串
let dataString = UDATA["uid"] + "#START_AC#" + UDATA["uaccount"] + "#END_AC#" +
"#START_TIME#" + time + "#END_TIME#" +
"#START_SF#" + UDATA['usf'] + "#END_SF#";
// 使用 TextEncoder 进行 UTF-8 编码
const encoder = new TextEncoder();
const dataUint8Array = encoder.encode(dataString);
// 将 Uint8Array 转换为 Base64
localStorage.setItem("token", btoa(Array.from(dataUint8Array, byte => String.fromCharCode(byte)).join('')));
解码
onMounted(() => {
// 从本地存储获取 token
// 从 localStorage 中获取 Base64 编码的字符串
const token = localStorage.getItem("token");
if (token) {
try {
// 解码 base64 格式的 token
// 使用 atob 函数将 Base64 字符串解码为二进制数据表示的字符串
const binaryString = atob(token);
// 将二进制字符串转换回 Uint8Array
const dataUint8Array = Uint8Array.from(Array.from(binaryString, char => char.charCodeAt(0)));
// 使用 TextDecoder 将 Uint8Array 解码回原始的 UTF-8 字符串
const decoder = new TextDecoder('utf-8');
const decodedString = decoder.decode(dataUint8Array);
// 现在 decodedString 包含了原始的 dataString
console.log(decodedString);
let decodedToken = decodedString
// 提取并验证 token 中的各个部分
const tokenParts = decodedToken.split("#START_TIME#")[1].split("#END_TIME#")[0];
const timestamp = parseInt(tokenParts, 10); // 总是指定 radix 为 10,避免潜在的安全问题
const tokenSF = decodedToken.split("#START_SF#")[1].split("#END_SF#")[0];
console.log("身份", tokenSF);
// 检查 token 是否过期(以7天为期限)
const sevenDaysInSeconds = 7 * 24 * 60 * 60;
const currentTimestamp = parseInt(new Date().getTime() / 1000, 10);
if ((currentTimestamp - timestamp) < sevenDaysInSeconds) {
console.log("自动登录!欢迎回来~");
// 这里可以继续进行其他自动登录后的操作
} else {
// 登录已过期,显示通知并跳转到登录页面
notification.open({
message: '通知',
description: "登录已过期,请重新登录。",
icon: () => h(SmileOutlined, {style: 'color: #108ee9'}),
});
localStorage.removeItem("token"); // 清除过期的 token
router.push("/login");
}
} catch (error) {
console.error("Error decoding token:", error);
// 处理错误:清除无效的 token 并跳转到登录页面
localStorage.removeItem("token");
router.push("/login");
}
} else {
// 如果没有 token,直接跳转到登录页面
router.push("/login");
}
});
关键代码
// 使用 atob 函数将 Base64 字符串解码为二进制数据表示的字符串
const binaryString = atob(token);
// 将二进制字符串转换回 Uint8Array
const dataUint8Array = Uint8Array.from(Array.from(binaryString, char => char.charCodeAt(0)));
// 使用 TextDecoder 将 Uint8Array 解码回原始的 UTF-8 字符串
const decoder = new TextDecoder('utf-8');
const decodedString = decoder.decode(dataUint8Array);
// 现在 decodedString 包含了原始的 dataString
console.log(decodedString);
【前端】2024年 前端Base64编码的中文处理问题的更多相关文章
- PHP处理base64编码字符串
接收前端传过来的base64编码后的字符串, 如果是json字符串, 那么PHP使用file_get_contents('php://input'); 来接收. 本次这里是以post传参的形式传bas ...
- base64编码的字符串(含有中文) 前端解码
base64编码的字符串(含有中文) 前端解码 https://xue5602.github.io/2018/12/19/atob%E8%A7%A3%E7%A0%81utf-8%E5%AD%97%E7 ...
- 前端对base64编码的理解,原生js实现字符base64编码
目录 常见对base64的认知(不完全正确) 多问一个为什么,base64到底是个啥? 按照我们的思路实现一下 到这里基本就实现了,结果跟原生的方法打印的是一样的 下一次 @( 对于前端工程师来说ba ...
- 【前端攻略】:玩转图片Base64编码
引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 编码.标题略大,不过只是希望通过一些浅显 ...
- 【前端攻略】:玩转图片Base64编码(转)
引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的Base64编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的base64编码.标题略大,不过只是希望通过一些浅显的论述, ...
- 前端上传图片回显并用base64编码,后端做解码储存,存储图片路径在.properties文件中配置(以上传身份证照片为例)
前端页面:<form id="kycForm" enctype="multipart/form-data"> <input type=&quo ...
- 前端上传 base64 编码图片到七牛云存储
参考文档 如何上传base64编码图片到七牛云 调试过程 文档中分别有 java 和 html 的 demo,可以根据文档示例调试. 下面是我调试的过程,可以作为参考,特别注意的是,如果需要给文件起名 ...
- base64编码后的pdf文件前端页面展示--pdf.js的应用
最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...
- weui上传多图片,前端压缩,base64编码
记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片 因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错, ...
- 前端 img标签显示 base64格式的 图片
本文链接:https://blog.csdn.net/kukudehui/article/details/80409522在做项目的时候,我从后端返回了一个base64格式的图片文件,想把它渲染在前端 ...
随机推荐
- Windows 10 LTSC 2019(1809) WSL 安装 CentOS 7
1.安装WSL 通过控制面板--程序和功能--启用或关闭WIndows功能,勾选"适用于Linux的Windows子系统". 或者通过管理员权限打开 PowerShel ...
- initrd&init进程
initrd的全名是 init ramdisk,是一个启动时存在于内存的文件系统. kernal 到 initrd的流程 在GRUB加载kernel时,kernel会先在内存中制造一个rootfs当做 ...
- iOS使用SourceTree回滚回滚小结
代码回滚,适用于的场景: 1.提交错代码,想放弃刚刚提交的部分:2.代码发生冲突,处理比较麻烦,为了代码安全,直接回滚到之前干净的代码.我个人理解,可以分为本地回滚和远程回滚: 一.本地回滚,回滚自己 ...
- Monaco Editor 实现一个日志查看器
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:文长 前言 在 Web IDE 中,控制台中展示日志是至关 ...
- Chirpy+Github
相关网址 Chirpy 示例:网页上有官方教程,我写的肯定不全 Chirpy 示例仓库:这个就是包含官方教程的那个示例的仓库 Chirpy 模板仓库:直接 fork 这个仓库,快速搭建,没有多余的东西 ...
- linux不常用命令
1.查看进程的内存资源占用 [root@abdi1 elasticsearch]# pidstat -r -p 1791 1 Linux 3.10.0-514.el7.x86_64 (abdi1) 0 ...
- 2024-10-30:或值至少 K 的最短子数组 I。用go语言,给定一个非负整数数组 nums 和一个整数 k,我们需要判断数组中是否存在一个最短的非空子数组,使得该子数组所有元素的按位或(OR)运
2024-10-30:或值至少 K 的最短子数组 I.用go语言,给定一个非负整数数组 nums 和一个整数 k,我们需要判断数组中是否存在一个最短的非空子数组,使得该子数组所有元素的按位或(OR)运 ...
- My SQL 列转行操作
原表结构如下,我们可以发现,"日运输量"和"车次"是在同一张表中相互独立的两个字段,即独立的两列数据,下面,我将系统中的测试数据以及代码全部放出来,以解释列转行 ...
- SDUT 2021 Autumn Team Contest 36th G - Alice’s Stamps(补)
队友做出的这个题,赛后补的=.= G - Alice's Stamps (一般DP) 题目大意 :给你m个区间,选k个,求k个区间并集 1≤T≤100 1≤K≤M 1≤N,M≤2000 1≤Li≤ R ...
- 实时数仓及olap可视化构建(基于mysql,将maxwell改成seatunnel可以快速达成异构数据源实时同步)
1. OLAP可视化实现(需要提前整合版本) Linux121 Linux122 Linux123 jupyter spark python3+SuperSet3.0 hive ClinckHouse ...