【vue3+pinia+Cookie】实现token登录及数据持久化

news2024/9/24 1:20:24

vue2后台登录项目,目前接触到的基本上都是vuex+本地存储或vuex+cookie或vuex+专门用于持久化vuex的库,如:vuex-persistedstate

vuex默认情况下是在客户端内存中保存应用程序的状态,当页面刷新的时候,内存中的数据会丢失,导致vuex中的数据也会丢失。因为vuex的状态存储是临时的,不会被持久化到本地存储或服务器。

所以做登录的时候仅靠vuex是不够的,还需要将数据持久化。

**在vue3中也是同理,本文使用的是pinia+Cookie

pinia同vuex,是vue.js的官方状态管理库,用于管理应用程序的状态(数据),集中化状态管理,组件间数据共享,更好的响应式特性,支持扩建发展,方便的调试工具。

Cookie是一种在客户端(浏览器)和服务器之间传递数据的小文件,它通常由服务器在HTTP响应中设置,并存储在浏览器中,由浏览器在后续的请求中将Cookie发送回服务器。
Cookie主要用于存储和传递一些关于用户和网站之间交互的数据,例如用户的偏好设置,登录信息,购物车内容等,它们可以用于在不同的请求之间保持状态,使得网站能够识别用户并提供个性化的体验
和Cookie有类似机制,用于在客户端和服务端传递数据的机制的还有:
1、Session Storage(会话存储),该数据仅在当前会话期间有效,数据只在浏览器关闭窗口之前保留
2、Local Storage(本地存储),该数据在不同会话之间是持久的,只有在用户明确清除浏览器缓存或通过代码删除时才会被移除
3、web Storage(网页存储),Web Storage是Session Storage和Local Storage的总称。它包括Session Storage和Local Storage这两个机制,提供了在客户端存储数据的能力。
4、IndexedDB(索引数据库),IndexedDB是一种在客户端存储结构化数据的API。它提供了一个类似数据库的环境,可以在浏览器中创建和管理数据库,以存储和检索大量数据。与Cookie不同,IndexedDB可以存储更复杂的数据类型,并提供更高级的数据查询和索引功能
说回Cookie,一个Cookie主要包含以下几个属性:
名称(Name):Cookie的名称或键(Key),用于标识Cookie。
值(Value):与Cookie相关联的具体数据值。
域(Domain):指定Cookie可用的域名。默认情况下,Cookie仅在创建它的域和其子域名下可用。
路径(Path):指定Cookie可用的路径。默认情况下,Cookie仅在创建它的页面所在路径下可用。
过期时间(Expires):指定Cookie的过期时间。一旦过期,浏览器将不再发送该Cookie。
Cookie的工作流程:
客户端(浏览器)发送请求到服务器。
服务器在HTTP响应中设置Cookie。
浏览器接收到HTTP响应,并将Cookie存储在本地。
在后续的请求中,浏览器将Cookie发送到服务器。
服务器接收到Cookie,并根据其中的数据进行处理。
通过使用Cookie,网站可以在客户端和服务器之间传递数据,并维持状态,实现个性化的用户体验和其他功能。**


现在开始详细的思路及代码展示:

1、如果在项目中直接使用cookie,写法会有些复杂,这个时候就要说js-cookie啦,一个用于在浏览器中操作Cookie的Javascript库,提供了一组简单而强大的API,方便地设置,读取和删除Cookie

安装js-cookie

npm install --save js-cookie

utils文件夹下新建auth.js
在这里插入图片描述
auth.js

import Cookies from 'js-cookie'

const TokenKey = 'Admin-Token'

export function getToken() {
   
  return Cookies.get(TokenKey)//获取键名为Admin-Token的值
}

export function setToken(token) {
   
  return Cookies.set(TokenKey, token)//设置键名Admin-Token,值为token
}

export function removeToken() {
   
  return Cookies.remove(TokenKey)//移除键名为Admin-Token的值
}

2、pinia中调用登录、获取用户信息及退出接口。将登录接口、获取用户信息接口和登出接口放在pinia中的主要原因是为了方便的在应用程序中进行状态管理和共享数据

登录接口::当用户通过登录界面输入用户名和密码进行登录时,登录接口负责向服务器发送请求验证用户身份。将登录接口放在Vuex中可以存储用户的登录状态和认证信息,并在需要的地方进行调用和更新。这样,其他组件可以轻松地访问和使用用户登录信息。
获取用户信息接口:在应用程序中,可能会有多个组件需要获取用户的个人信息来展示或执行某些操作。通过将获取用户信息接口放在Vuex中,可以实现数据的统一管理和共享。当用户登录后,将用户信息保存在Vuex中,其他组件可以直接从Vuex获取用户信息,而不需要在每个组件中单独请求数据
登出接口:登出接口负责清除用户的登录状态,并将用户重定向到登录页面。将登出接口放在Vuex中可以方便地更新登录状态和清除用户信息,确保应用程序的其他部分能够及时响应。

通过将这些接口放在Vuex中,可以方便地进行状态管理和共享数据,提高代码的可维护性和可拓展性。同时,将数据集中存储在Vuex中,还有助于避免在组件之间频繁传递数据,提高了应用程序的性能。

在store文件夹下新建index.js和新建modules文件夹,新建user.js和index.js
index.js中创建pinia实例对象,对外导出
具体如下:

import {
    createPinia } from "pinia"
const store = createPinia()
export default store

user.js
在这里插入图片描述

先引入defineStore,pinia中通过defineStore定义store

import {
   defineStore} from "pinia"

引入登出,获取用户信息和登录的接口

import {
    login, logout, getInfo } from '@/api/login'

再引入操作token的方法

import {
    getToken, setToken, removeToken } from '@/utils/auth'

具体如下:

import {
   defineStore} from "pinia"
import {
    login, logout, getInfo } from '@/api/login'
import {
    getToken, setToken, removeToken } from '@/utils/auth'

//对 `defineStore

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

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

相关文章

linux-删除KVM虚拟机

1.查看主机 #virsh list 2.关闭主机 #virsh shutdown 虚拟机名称 3.删除主机定义 #virsh undefine 虚拟机名称 4.删除KVM虚拟机文件 #find / -name 虚拟机名称 #rm -rf 虚拟机文件

Windows11安装Linux子系统,并实现服务自启动,局域网访问,磁盘挂载

Windows11安装Linux子系统,并实现服务自启动,局域网访问,磁盘挂载 一、准备工作二、安装Linux子系统(wsl2)三、为Linux子系统设置桥接网络检查wsl版本在 Hyper-V 管理器中创建虚拟交换机创建 WSL 配置文件启动wsl 四、设置Windows开机自启动L…

【考研复习】24王道数据结构课后习题代码|第3章栈与队列

文章目录 3.1 栈3.2 队列3.3 栈和队列的应用 3.1 栈 int symmetry(linklist L,int n){char s[n/2];lnode *pL->next;int i;for(i0;i<n/2;i){s[i]p->data;pp->next;}i--;if(n%21) pp->next;while(p&&s[i]p->data){i--;pp->next;}if(i-1) return 1;…

openssl安装问题合辑

1.openssl拖累nginx编译失败 问题描述&#xff1a; 因为漏洞原因&#xff0c;升级openssl之后需要重新编译nginx&#xff0c;进行了以下步骤&#xff1a; config没问题&#xff0c;但是make一直报错 初步判断是openssl安装有问题&#xff0c;原因不明&#xff0c;重装了opens…

【ARM Cache 系列文章 9 -- ARM big.LITTLE技术】

文章目录 big.LITTLE 技术背景big.LITTLE 技术详解big.LITTLE 硬件要求 big.LITTLE 软件模型CPU MigrationGlobal Task SchedulingGlobal Task Scheduling比CPU Migration的优势 转自&#xff1a;https://zhuanlan.zhihu.com/p/630981648 如有侵权&#xff0c;请联系删除 big.L…

Codeforces Round 889 (Div. 2)C题题解

文章目录 [Dual (Hard Version)](https://codeforces.com/contest/1855/problem/C2)问题建模问题分析1.按元素值分类讨论&#xff0c;正负不同时存在时2.若正负同时存在时代码 Dual (Hard Version) 问题建模 给定n个数&#xff0c;n不超过20&#xff0c;且每个数ai&#xff0c…

MachineLearningWu_14/P65-P69_Multiclass

x.1 Multiclass多分类问题 对于分类问题&#xff0c;往往指的是二分类问题&#xff0c;而对于二分类的decision boundary较为简单&#xff0c;而实际生活中会有很多问题是多分类问题&#xff0c;例如MNIST手写数字识别&#xff0c; 从特征空间上来看&#xff0c;二分类和多分类…

【C++】开源:ncurses终端TUI文本界面库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍ncurses终端文本界面库。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

OpenCV基础知识4 — 绘制图形

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。Opencv提供了许多用于绘制图形的方法&#xff0c;包括绘制线段的line()方法、绘制矩形的retangle()方法、绘制圆形的circle()方法、绘制多边形的polylines()方法和绘制文字的putText()方法。本节课将依次对上述各个方法进行…

【JPCS出版】第五届能源、电力与电网国际学术会议(ICEPG 2023)

第五届能源、电力与电网国际学术会议&#xff08;ICEPG 2023&#xff09; 2023 5th International Conference on Energy, Power and Grid 最近几年&#xff0c;不少代表委员把目光投向能源电力领域&#xff0c;对促进新能源发电产业健康发展、电力绿色低碳发展&#xff0c;提…

【动态内存管理助力程序优化与性能飞升】

本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈…

R语言中的函数24:Combinat:combn(), permn()

介绍 combinat中的combn()和permn()函数可以得到所有的排列组合的情况 combn()函数 combn(x, m, funNULL, simplifyTRUE, …)x – 组合的向量源m – 要取的元素的数量fun – 应用于每个组合的函数(可能为空)simplify – 逻辑的&#xff0c;如果是FALSE&#xff0c;返回一个列…

计算机视觉的应用9-视觉领域中的61个经典数据集【大集合】的应用与实战

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用9-视觉领域中的61个经典数据集【大集合】的应用与实战,我们都知道计算机视觉是一门研究如何使计算机能够理解和解释数字图像或视频的技术和方法。在计算机视觉领域中,数据集是非常重要的资源,它们可以用于训练和评估…

C++(Qt)软件调试---将调试工具安装到AeDebug(11)

C(Qt)软件调试—将调试工具安装到AeDebug&#xff08;11&#xff09; 文章目录 C(Qt)软件调试---将调试工具安装到AeDebug&#xff08;11&#xff09;1、前言1.1 使用的调试工具 2、调试器安装1.1 WinDbg1.2 procdump1.3 DrMinGW1.4 vsjitdebugger 更多精彩内容&#x1f449;个…

C++学习| VS配置FFTW3以及一维傅里叶变换的使用

前言&#xff1a;最近要用C对信号进行一维傅里叶变换&#xff0c;但是对傅里叶变换的内容有些遗忘了&#xff0c;同时自己对FFTW使用也不太了解&#xff0c;所以写下此篇方便以后回顾。 VS项目配置FFTW3 FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散…

STM32 F103C8T6学习笔记2:GPIO的认识—GPIO的基本输入输出—点亮一个LED

今日继续学习使用 STM32 F103C8T6开发板 点亮一个LED灯&#xff0c;文章提供源码&#xff0c;测试工程&#xff0c;实验效果图&#xff0c;希望我的归纳总结会对大家有帮助~ 目录 GPIO的认识与分类 &#xff1a; 引脚安排整理&#xff1a; 定时器的引脚例举&#xff1a; …

openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句

文章目录 openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句35.1 语法格式35.2 参数说明35.3 示例 openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句 修改表&#xff0c;包括修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所…

npm 报错 cb() never called!

不知道有没有跟我一样的情况&#xff0c;在使用npm i的时候一直报错&#xff1a;cb() never called! 换了很多个node版本&#xff0c;还是不行&#xff0c;无法解决这个问题 百度也只是让降低node版本请缓存&#xff0c;gpt给出的解决方案也是同样的 但是缓存清过很多次了&a…

Vue自定义指令使用

本篇文章讲述使用Vue自定义指令&#xff0c;并在项目中完成相应功能。 在平常Vue脚手架项目中&#xff0c;使用到 自定义指令较少&#xff0c;一般都是使用的自带指令&#xff0c;比如 v-show 、v-if 、 v-for 、 v-bind 之类的。这些已经能够满足大多数项目使用。更多的可能也…