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

在 Vue 项目中,登录成功后是否存储 token 与用户信息到本地

答案:不安全

举例:直接使用localStorage存储,本地存储可能会被 XSS 攻击窃取

            localStorage.setItem('token', response.token)localStorage.setItem('userInfo', JSON.stringify({username: response.username,email: response.email}))

推荐方案:

// 登录成功后的存储策略
const handleLoginSuccess = (response) => {// 1. 使用localStorage存储token(长期有效)localStorage.setItem('token', response.token);// 2. 使用sessionStorage存储敏感信息(会话级)sessionStorage.setItem('userRole', response.role);// 3. 状态管理(推荐Pinia)store.user.setToken(response.token);store.user.setUserInfo(response.user);// 4. 路由跳转router.push(redirectPath);
}

技术实现建议:

  • 分层存储策略

    • localStorage:存储 token(长期有效)
    • sessionStorage:存储敏感信息(会话级)
    • Pinia:存储当前用户状态(响应式)
  • 安全增强措施

// 存储时增加加密处理
const encryptedToken = CryptoJS.AES.encrypt(response.token,import.meta.env.VITE_ENCRYPT_KEY
).toString();
localStorage.setItem('secureToken', encryptedToken);
  • 自动续期机制

// 检查token有效期
const checkTokenExpiration = () => {const expires = localStorage.getItem('tokenExpires');if(Date.now() >= expires) {refreshToken(); // 自动刷新token}
}

最佳实践:

1、使用 localStorage 存储 token,但需配合以下措施:

  • 前端加密存储
  • 限制 token 作用域
  • 设置合理过期时间

token添加域名前缀,防止不同域名之间的数据冲突,同时避免XSS攻击

            const tokenKey = 'auth_token_' + window.location.hostnameconst userKey = 'user_data_' + window.location.hostname

设置token过期时间为24hour

            // 设置token,添加过期时间const tokenData = {token: response.token,expires: Date.now() + 24 * 60 * 60 * 1000 // 24小时后过期}sessionStorage.setItem(tokenKey, JSON.stringify(tokenData))

 只存必要的用户信息,并进行简单加密

            // 只存储必要的用户信息,并进行简单加密const userData = {username: response.username,email: response.email,lastLogin: Date.now()}sessionStorage.setItem(userKey, JSON.stringify(userData))

2、敏感信息(如用户角色)使用 sessionStorage 存储

3、所有 API 请求携带 token(请求拦截器)

// axios拦截器示例
axios.interceptors.request.use(config => {const token = localStorage.getItem('token');if(token) {config.headers.Authorization = `Bearer ${token}`;}return config;
});

4、路由守卫验证 

    // router守卫示例
    router.beforeEach((to, from, next) => {const token = store.user.token;if(to.meta.requiresAuth && !token) {next('/login?redirect=' + to.fullPath);} else {next();}
    });

     

      相关文章:

      在 Vue 项目中,登录成功后是否存储 token 与用户信息到本地

      答案:不安全 举例:直接使用localStorage存储,本地存储可能会被 XSS 攻击窃取 localStorage.setItem(token, response.token)localStorage.setItem(userInfo, JSON.stringify({username: response.username,email: response.email})) 推荐方…...

      【加密社】做一个展示币种价格的组件

      具体的代码是以下,可以看到 <div id"crypto-price-widget"><p class"loading">Loading cryptocurrency prices... <span class"spinner"></span></p> </div><script> document.addEventListener(DOM…...

      CANoe入门——CANoe的诊断模块,调用CAPL进行uds诊断

      目录 一、诊断窗口介绍 二、诊断数据库文件管理 三、添加基础诊断描述文件&#xff08;若没有CDD/ODX/PDX文件&#xff09;并使用对应的诊断功能进行UDS诊断 3.1、添加基础诊断描述文件 3.2、基于基础诊断&#xff0c;使用诊断控制台进行UDS诊断 3.2.1、生成基础诊断 3.…...

      AI日报 - 2025年3月30日

      &#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; 模型进展 | Qwen2.5-Omni多模态实时交互&#xff0c;Gemini 2.5 Pro/GPT-4o低调升级&#xff0c;Claude内部思考过程揭秘。 新模型和升级持续涌现&#xff0c;多模态与内部机制理解成焦点。 ▎&#x…...

      蓝桥刷题note11(好数)

      1&#xff0c;好数 一个整数如果按从低位到高位的顺序&#xff0c;奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数&#xff0c;偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数&#xff0c;我们就称之为 “好数”。 给定一个正整数 NN&#xff0c;请计算从 1 到 NN 一共…...

      Go常用的设计模式

      Go常用的设计模式 常见的设计模式&#xff0c;如 单例模式、工厂模式、策略模式、观察者模式、代理模式、装饰器模式 和 适配器模式 都可以在 Go 中实现&#xff0c;适用于不同的开发需求。 这些设计模式不仅能帮助你编写结构清晰、可维护的代码&#xff0c;还能让你更好地应…...

      复现文献中的三维重建图像生成,包括训练、推理和可视化

      要复现《One - 2 - 3 - 45 Fast Single Image to 3D Objects with Consistent Multi - View Generation and 3D Diffusion (CVPR)2024》文献中的三维重建图像生成&#xff0c;包括训练、推理和可视化&#xff0c;并且确保代码能正常运行&#xff0c;下面是基本的实现步骤和示例…...

      day17 学习笔记

      文章目录 前言一、数组的增删改查1.resize函数2.append函数3.insert函数4.delete函数5.argwhere函数6.unique函数 二、统计函数1.amax&#xff0c;amin函数2.ptp函数3.median函数4.mean函数5.average函数6.var&#xff0c;std函数 前言 通过今天的学习&#xff0c;我掌握了num…...

      Mysql练习题

      先创建对应数据表 #先创建表 #学生表 Student create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)); insert into Student values(01 , 赵雷 , 1990-01-01 , 男); insert into Student values(02 , 钱电 , 1990-12-21 , 男); insert int…...

      torch不能使用cuda的解决方案

      遇到了这样的报错&#xff0c;说明 torch不能使用cuda 反思 我频繁地尝试安装不同的 nvdia 驱动&#xff0c;浪费了很多时间。因为我的错误地认为nvidia会自带cuda&#xff0c;其实cuda需要单独安装。 还有我的torch是cpu版本的&#xff0c;即使nvidia cuda安装了&#xff0…...

      Python 循环全解析:从语法到实战的进阶之路

      一、问答题 &#xff08;1&#xff09;下面的循环体被重复了多少次?每次循环的输出结果是什么? i1 while i < 10:if i % 2 0:print(i)死循环&#xff0c;没有输出结果 i1 while i < 10:if i % 2 0:print(i)i l死循环&#xff0c;没有输出结果 i 1 while i< 10…...

      代码随想录算法训练营--打卡day3

      复习&#xff1a;标注感叹号的需要在电脑上重新做几遍 一.两两交换链表中的节点&#xff01;&#xff01; 1.题目链接 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2.思路 画图 3.代码 class Solution {public ListNode swapPairs(ListNode head) …...

      ubuntu 安装mysql

      在 Ubuntu 系统中安装 MySQL 的步骤如下&#xff1a; 步骤 1&#xff1a;更新软件包列表 sudo apt update步骤 2&#xff1a;安装 MySQL 服务器 sudo apt install mysql-server -yUbuntu 22.04/20.04 默认安装 MySQL 8.0&#xff0c;早期版本可能默认使用 MariaDB。 如果需要…...

      用Python实现资本资产定价模型(CAPM)

      使用 Python 计算资本资产定价模型&#xff08;CAPM&#xff09;并获取贝塔系数&#xff08;β&#xff09;。 步骤 1&#xff1a;导入必要的库 import pandas as pd import yfinance as yf import statsmodels.api as sm import matplotlib.pyplot as plt 步骤 2&#xff1…...

      Conda配置Python环境

      1. 安装 Conda 选择发行版&#xff1a; Anaconda&#xff1a;适合需要预装大量科学计算包的用户&#xff08;体积较大&#xff09;。 Miniconda&#xff1a;轻量版&#xff0c;仅包含 Conda 和 Python&#xff08;推荐自行安装所需包&#xff09;。 验证安装&#xff1a; co…...

      Redisson延迟队列实战:分布式系统中的“时间管理者“

      目录 引言&#xff1a;延迟队列的魅力与应用 什么是Redisson延迟队列&#xff1f; 技术原理与工作机制 应用场景 环境准备&#xff1a;搭建基础 Maven依赖配置 Redisson客户端配置 延迟队列实现&#xff1a;核心代码 工作原理深度解析 数据模型与存储结构 元素流转过…...

      国产化适配 - YashanDB、达梦数据库与MySQL 的兼容性及技术选型对比分析

      根据知识库信息&#xff0c;以下是 YashanDB、达梦数据库与MySQL 的兼容性及技术选型对比分析&#xff1a; 1. YashanDB 与 MySQL 兼容性 协议与语法兼容 &#xff1a; YashanDB 100%兼容 MySQL 5.7协议 的常用命令&#xff08;如 SELECT、INSERT&#xff09;&#xff0c;但…...

      从0开始——在PlatformIO下开展STM32单片机的HAL库函数编程指南

      目录 前言 编写时钟初始化 实现Systicks_Handler&#xff0c;完成HAL库的时基更新 编写驱动测试 前言 笔者最开始的尝试是在2025年的寒假&#xff0c;准备向PlatformIO迁移HAL库&#xff0c;注意&#xff0c;截止到目前&#xff0c;PlatformIO对HAL库的支持已经非常完善了。…...

      Python小练习系列 Vol.9:杨辉三角生成(数组构建 + 数学组合)

      &#x1f9e0; Python小练习系列 Vol.9&#xff1a;杨辉三角生成&#xff08;数组构建 数学组合&#xff09; &#x1f53a; 本期我们带来一道简洁却优雅的经典练习 —— 生成杨辉三角&#xff0c;是训练数组操作与组合思想的绝佳题目&#xff01; &#x1f9e9; 一、题目描述…...

      Webview详解(下)

      第三阶段&#xff1a;性能优化 加载速度优化 缓存策略 缓存策略可以显著减少网络请求&#xff0c;提升页面加载速度。常用的缓存策略包括 HTTP 缓存和本地资源预加载。 1. HTTP 缓存 HTTP 缓存利用 HTTP 协议中的缓存机制&#xff08;如 Cache-Control、ETag 等&#xff0…...

      scss基础用法

      SCSS&#xff08;Sassy CSS&#xff09;是Sass的增强版本&#xff0c;作为CSS的预处理器&#xff0c;它提供了多种功能来提高代码的可维护性和效率。以下是SCSS的基础用法&#xff1a; 变量&#xff08;Variables&#xff09; 用于存储常用的值&#xff0c;如颜色、字体大小等。…...

      知能行每日综测

      题目1 自己的做法 答案 题目2 自己的 答案 题目3 注意&#xff1a;这道做错了&#xff0c;你们可以看看我哪里错了 题目4 我的 答案 题目5 没思路&#xff0c;不会做 已更改 题目6 答案 第七题 我的 不会 现在补综测最后一个...

      c++ vs和g++下的string结构

      话不多说进入正题.注:下述结构是在32位平台下进行验证&#xff0c;32位平台下指针占4个字节. vs下string的结构 string总共占28个字节&#xff0c;内部结构稍微复杂一点&#xff0c;先是有一个联合体&#xff0c;联合体用来定义 string中字符串的存储空间&#xff1a;(联合体的…...

      海量数据处理

      1.海量数据处理问题 给两个文件&#xff0c;分别有100亿个query&#xff0c;只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 解决方案一&#xff1a; 可以先用布隆过滤器&#xff0c;一个文件的query放进布隆过滤器&#xff0c;另一个文件依次查找&#xff0c;在的…...

      洛谷题单1-P5706 【深基2.例8】再分肥宅水-python-流程图重构

      题目描述 现在有 t t t 毫升肥宅快乐水&#xff0c;要均分给 n n n 名同学。每名同学需要 2 2 2 个杯子。现在想知道每名同学可以获得多少毫升饮料&#xff08;严格精确到小数点后 3 3 3 位&#xff09;&#xff0c;以及一共需要多少个杯子。 输入格式 输入一个实数 t …...

      【HarmonyOS 5】初学者如何高效的学习鸿蒙?

      【HarmonyOS 5】初学者如何高效的学习鸿蒙&#xff1f; 一、前言 在全球科技格局风云变幻的当下&#xff0c;谷歌安卓系统的管控逐步收紧&#xff0c;加之国际形势愈发复杂&#xff0c;打造中国人自主的操作系统&#xff0c;已成为时代发展的必然要求&#xff0c;这不仅是突破…...

      Java NIO之FileChannel 详解

      关键点说明 文件打开选项&#xff1a; StandardOpenOption.CREATE - 文件不存在时创建 StandardOpenOption.READ/WRITE - 读写权限 StandardOpenOption.APPEND - 追加模式 StandardOpenOption.TRUNCATE_EXISTING - 清空已存在文件 缓冲区操作&#xff1a; ByteBuffer.wrap…...

      数据可视化(matplotlib)-------图表样式美化

      目录 一、图表样式概述 &#xff08;一&#xff09;、默认图表样式 &#xff08;二&#xff09;、图表样式修改 1、局部修改 2、全局修改 二、使用颜色 &#xff08;一&#xff09;、使用基础颜色 1、单词缩写或单词表示的颜色 2、十六进制/HTML模式表示的颜色 3、RGB…...

      Go 语言中,关于客户端初始化的最佳实践

      在 Go 语言中&#xff0c;关于客户端初始化的最佳实践确实需要注意以下几点&#xff1a; 全局单例模式是推荐做法&#xff0c;尤其对于需要保持长连接或需要复用资源的客户端&#xff08;如数据库、Redis、HTTP 客户端等&#xff09;并发安全是必须保证的&#xff0c;需要确保…...

      MyBatis的第一天笔记

      1. MyBatis 概述 1.1 什么是框架 框架是对通用代码的封装&#xff0c;提前写好了一堆接口和类&#xff0c;可以直接引入使用框架一般以jar包形式存在Java常用框架&#xff1a;SSM三大框架&#xff08;Spring SpringMVC MyBatis&#xff09;、SpringBoot、SpringCloud等 1.…...

      区块链赋能,为木材货场 “智” 造未来

      区块链赋能&#xff0c;为木材货场 “智” 造未来 在当今数字化浪潮席卷的时代&#xff0c;软件开发公司不断探索创新&#xff0c;为各行业带来高效、智能的解决方案。今天&#xff0c;让我们聚焦于一家软件开发公司的杰出成果 —— 区块链木材货场服务平台&#xff0c;深入了…...

      IvorySQL:兼容Oracle数据库的开源PostgreSQL

      今天给大家介绍一款基于 PostgreSQL 开发、兼容 Oracle 数据库的国产开源关系型数据库管理系统&#xff1a;IvorySQL。 IvorySQL 由商瀚高软件提供支持&#xff0c;主要的功能特性包括&#xff1a; 完全兼容 PostgreSQL&#xff1a;IvorySQL 基于 PostgreSQL 内核开发&#xf…...

      Python 序列构成的数组(切片)

      切片 在 Python 里&#xff0c;像列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;和字符串&#xff08;str&#xff09;这类 序列类型都支持切片操作&#xff0c;但是实际上切片操作比人们所想象的要强大 很多。 这一节主要讨论的是这些高级切片形式的…...

      Pre-flash和Main flash

      在相机拍照过程中&#xff0c;Pre-flash&#xff08;预闪光&#xff09; 和 Main flash&#xff08;主闪光&#xff09; 是常见的两种闪光灯使用模式&#xff0c;通常用于提高低光环境下的拍摄质量&#xff0c;尤其在自动曝光&#xff08;AE&#xff09;和自动对焦&#xff08;…...

      【区块链安全 | 第十篇】智能合约概述

      部分内容与前文互补。 文章目录 一个简单的智能合约子货币&#xff08;Subcurrency&#xff09;示例区块链基础交易区块预编译合约 一个简单的智能合约 我们从一个基础示例开始&#xff0c;该示例用于设置变量的值&#xff0c;并允许其他合约访问它。 // SPDX-License-Identi…...

      判断质数及其优化方法

      判断质数&#xff08;素数&#xff09;及其优化方法 质数是指 大于1的自然数&#xff0c;且 只有1和它本身两个正约数。以下是几种判断方法及其优化策略。 目录 基础方法&#xff08;试除法&#xff09;优化1&#xff1a;仅检查到√n优化2&#xff1a;跳过偶数优化3&#xff…...

      【源码阅读/Vue Flask前后端】简历数据查询功能

      目录 一、Flask后端部分modelServiceroute 二、Vue前端部分index.js main.vue功能界面templatescriptstyle 一般就是三个层面&#xff0c;model层面用来建立数据库的字段&#xff0c;service用来对model进行操作&#xff0c;写一些数据库操作的代码&#xff0c;route就是具体的…...

      R语言对偏态换数据进行转换(对数、平方根、立方根)

      我们进行研究的时候经常会遇见偏态数据&#xff0c;数据转换是统计分析和数据预处理中的一项基本技术。使用 R 时&#xff0c;了解如何正确转换数据有助于满足统计假设、标准化分布并提高分析的准确性。在 R 中实现和可视化最常见的数据转换&#xff1a;对数、平方根和立方根转…...

      链表(C++)

      这是本人第二次学习链表&#xff0c;第一次学习链表是在大一上的C语言课上&#xff0c;首次接触&#xff0c;感到有些难&#xff1b;第二次是在大一下学习数据结构时&#xff08;就是这次&#xff09;&#xff0c;使用C再次理解链表。同时&#xff0c;这也是开启数据结构学习写…...

      算法-前缀和与差分

      一、前缀和&#xff08;Prefix Sum&#xff09; 1. 核心思想 前缀和是一种预处理数组的方法&#xff0c;通过预先计算并存储数组的前缀和&#xff0c;使得后续的区间和查询可以在**O(1)**时间内完成。 2. 定义 给定数组 nums&#xff0c;前缀和数组 prefixSum 的每个元素 p…...

      网关接口超时?用Java实现接口快速返回,后台继续执行的方法

      网关接口超时&#xff1f;用Java实现接口快速返回&#xff0c;后台继续执行的方法 在开发过程中&#xff0c;我们经常会遇到网关接口由于超时限制而导致请求失败的情况。然而&#xff0c;有些接口本身就需要较长时间来执行任务&#xff0c;这时我们不能简单地增加超时时间&…...

      HTTP---基础知识

      天天开心&#xff01;&#xff01;&#xff01; 文章目录 一、HTTP基本概念1. 什么是HTTP&#xff0c;又有什么用&#xff1f;2. 一次HTTP请求的过程3.HTTP的协议头4.POST和GET的区别5. HTTP状态码6.HTTP的优缺点 二、HTTP的版本演进1.各个版本的应用场景2、注意要点 三、HTTP与…...

      python基础学习三(元组及字符串的使用)

      文章目录 元组什么是元组元组的创建方式为什么要将元组设计成不可变序列元组的遍历集合集合的相关操作集合操作集合的数学操作集合生成式列表&#xff0c;字典&#xff0c;元组&#xff0c;集合总结 字符串字符串的驻留机制判断字符串的操作方法字符串的比较操作字符串的切片操…...

      c#winform,倒鸭子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果

      不废话 直接上效果图 C# winform 开发抖音的瀑布流字幕。 也是typemonkey插件字幕效果 或者咱再网上常说的倒鸭子字幕效果 主要功能 1&#xff0c;软件可以自定义添加字幕内容 2&#xff0c;软件可以添加字幕显示的时间区间 3&#xff0c;可以自定义字幕颜色&#xff0c;可以随…...

      1、C51单片机(STC8G2K64S4)串口实验

      一、串口1接线图 1、下面是单片机外接电路图&#xff0c;P30,P31分别用于RXD和TXD功能引脚 2、我们来查看单片机手册 串口1需要设置的寄存器 串口1的功能脚配置选择位&#xff0c;看电路图选择的是P3.0,P3.1。 3、串口1&#xff1a;SCON控制寄存器 设置为0x50:0101 0000。&a…...

      ue材质学习感想总结笔记

      2025 - 3 - 27 1.1 加法 对TexCoord上的每一个像素加上一个值&#xff0c;如果加上0.1&#xff0c;0.1&#xff0c; 那么左上角原来0,0的位置变成了0.1,0.1 右上角就变成了1.1,1.1&#xff0c;那么原来0,0的位置就去到了左上角左上边&#xff0c;所以图像往左上偏移。 总而言…...

      MFC TRACE 宏的使用说明

      书籍&#xff1a;《Visual C 2017从入门到精通》的2.7 字符串 环境&#xff1a;visual studio 2022 内容&#xff1a;几个字符串类型->&#xff08;将单字节char*转换为宽字节wchar_t *&#xff09;&#xff08;将宽字节wchar_t* 转换为单字节char *&#xff09; 问题&am…...

      latex笔记

      1、基本结构 \documentclass[a4paper, 12pt]{article} %文档类型 \begin{document}\title{My First Document}\author{My Name}\date{\today}\maketitleA sentence of text. \end{document}2、带有章、节、小节的结构 \documentclass[a4paper, 12pt]{article}\begin{document…...

      Unity编辑器功能及拓展(3) —[Attribute]特性

      在 Unity 中&#xff0c;[Attribute]格式的特性是用于扩展编辑器功能、控制序列化行为和调整 Inspector 显示,进行编辑器拓展的核心工具。 一.基础编辑器拓展 1.基础序列化控制 1.[SerializeField] 强制显示私有变量到Inspector 2.[HideInInspector] 隐藏该字段在Inspect…...

      Rust基础语法

      以下是 Rust 语言基础语法的核心要点&#xff0c;结合与 JavaScript 的对比&#xff0c;帮助前端开发者快速掌握核心概念&#xff1a; 一、变量与常量 1. 变量声明 Rust&#xff1a;变量默认不可变&#xff0c;需用 mut 显式声明可变性。let x 5; // 不可变变量 le…...