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

news/2024/7/10 0:34:19 标签: vue

vue2vuexvuexcookievuexvuexvuexpersistedstate_0">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.niftyadmin.cn/n/4927219.html

相关文章

nbcio-boot因升级mybatis-plus到3.5.3.1和JSQLParser 到4.6引起的online表单开发的数据库导入出错解决

更多功能看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 nbcio-boot因升级…

将tp5项目、fastadmin项目部署到服务器宝塔面板

目录 一、将你的fastadmin或者tp5项目文件夹上传至你的服务器域名根目录下 二、修改你的网站目录指向,指向public目录,点击保存,并取消勾选防跨站攻击。 三、配置伪静态 四、fastadmin框架上传至服务器后如果想要访问后台可以进行重定向&am…

spring框架自带的http工具RestTemplate用法

1. RestTemplate是什么? RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式。 RestTemplate是一个执行HTTP请求的同步阻塞式工具类,它仅仅只是在 HTTP 客户端库(例如 JDK HttpURLConnection&a…

Linux下升级jdk1.8小版本

先输入java -version 查看是否安装了jdk java -version (1)如果没有返回值,直接安装新的jdk即可。 (2)如果有返回值,例如: java version "1.8.0_251" Java(TM) SE Runtime Enviro…

C++小游戏贪吃蛇源码

graphics.h是针对DOS下的一个C语言图形库 (c也可以) 目前支持下载此头文件的常用的有两种: 1. EGE (Easy Graphics Engine)2. EasyX Graphics LibraryEGE, 全名Easy Graphics Engine, 是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C语言新手的图形库…

若依vue -【 100 ~ 更 】

100 主子表代码生成详解 1 新建数据库表结构(主子表) -- ---------------------------- -- 客户表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

C++ string模拟实现(部分接口)

C string模拟实现 string模拟实现(部分接口) C的string类是一个类模板,用于表示和操作任何字符类型的字符串。 string类内部使用字符数组来存储字符,但是所有的内存管理,分配和空终止都由string类自己处理&#xff0c…

【学习笔记】[AGC063D] Many CRT

有点难。 首先判掉 gcd ⁡ ( c , d ) > 1 \gcd(c,d)>1 gcd(c,d)>1的情况。记 M lcm 1 ≤ k ≤ n ( c d k ) M\text{lcm}_{1\le k\le n}(cdk) Mlcm1≤k≤n​(cdk)。 我们将同余式变形为: d x ≡ d a k d b ( m o d c k d ) dx\equiv dakdb\pmod{ckd} …