首页 > 其他分享 >localstorage本地存储及token,vuex刷新数据丢失问题⚡⚡⚡

localstorage本地存储及token,vuex刷新数据丢失问题⚡⚡⚡

时间:2023-08-25 09:13:51浏览次数:48  
标签:axios token localstorage import vuex store

1.vuex和axios安装,引入,使用

1.1vuexa安装和使用

vuex3.x版本的官网安装教程:安装 | Vuex

vuex4.x版本的官网安装教程:安装 | Vuex

npm install vuex --save

2.在src下新建文件夹store,并在文件夹中新建文件index.js,如下:
import Vuex from 'vuex'
// 引入user  模块化modules
import user from '@/store/user'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
    // 注册user模块
    user
  }
})

***user.js为了模块化管理:需要在store/index.js里面引入进来。

***整个store模块在main.js里也需要引入进来

store/index.js里引入
 import Vue from 'vue'
import Vuex from 'vuex'

// 引入user  模块化modules
import user from '@/store/user'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
    // 注册user模块
    user
  }
})
main.js里也需要引入进来
 import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// 引入全局样式
import '../src/assets/global.less'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

// 引入axios
import axios from 'axios'
// 配置axios
axios.defaults.baseURL = 'http://big-event-vue-api-t.itheima.net'
// 将axios挂在到vue原型上
Vue.prototype.$http = axios

// element全局注册所有组件
Vue.use(ElementUI)

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
1.2axios安装和使用

npm install axios -g

2.将token本地localstorage存储

2.1.1  localstorage
在本地浏览器长期存储,需要手动清除才会消失(清除浏览器缓存或调用js方法清除)

2.2.2  sessionstorage
在本地浏览器存储,但只存在一次会话级(即浏览器关闭再打开就没了)

2.3.3  使用:
localstorage和sessionstorage使用一样,下面的只需要替换就行


// 存:第一个参数为存在本地的名字,即本地容器的名字
localstorage.setItem('token',b)
// 取:只有一个参数,即本地储存容器的名字
localstorage.getItem('token')
// 清除:只有一个参数,即本地储存容器的名字
localstorage.removeItem('token')
//清除所有
localstorage.clear()

2.1  登录状态token判定

在使用axios请求数据时:

//	具体的axios封装就不在这写了
//	请求拦截
axios.interceptors.request.use(config => {
	if (localstorage.getItem('token')) {
		const token = localstorage.getItem('token')	// 这里本地浏览器存了的话就取出来
		config.Token = token	// config.Token 的这Token可自己设置,与后端协商一致即可
	}
	return config
})
// 响应拦截
axios.interceptors.response.use(config => {
	if (config.Token) {
		const token = config.Token
		localstorage.setItem('token',token )
	}
})
2.2 在使用vuex时刷新页面,vuex的数据会重置:

这时就可以结合storage来解决,因为页面刷新必定会刷新最外层的APP.vue,所以这段就写在app.vue好了

created () {
	window.addEventListener('beforeunload',() => {
	// 不要忘了上面localstorage存数据的特性,用JSON.stringify
		sessionstorage.setItem('vuex',JSON.stringify(this.$store.state))
	})
	if(sessionstorage.getItem('vuex')) {
		this.$store.state = JSON.parse(sessionstorage.getItem('vuex'))
		//	因为感觉在storage看的到vuex不舒服,所以就加上了这步
		sessionstorage.removeItem('vuex')
	}
}

我在自己的项目里用到的方法是最基本的localstorage存储方式:

成功的将token拿到了~ok

3.将token存储Vuex

在login组件里调这个store/user.js的方法:updateToken

vuex插件里token数据拿到了~OK

4.刷新页面vuex数据丢失问题

4.1原因:

vuex存储的数据只是在页面中,相当于全局变量,页面刷新时vuex里的数据会重新初始化,导致数据丢失
vuex里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,vuex里面的数据会被重新赋值

4.2 解决思路:

将vuex的数据直接保存在浏览器的缓存中(sessionStorage、localStorage、cookie)
页面刷新后再从浏览器中取出

4.3 解决方法一
4.3.1选择合适的浏览器存储

       localStorage – 永久存储在本地,除非主动删除

       sessionStorage – 存储在当前tab页,关闭当前tab页就会消失

       cookie – 根据设置的有效时间来存储,缺点是内存小不能存储大数据且不易读取,会和后台进行交互

注:一般vue会选择sessionStorage,因为一是vue是单页面应用,操作都是在一个页面跳转路由,二是可以保证打开页面时,sessionStorage的数据为空,而如果是localStorage则会读取上一次打开页面的数据

4.3.2 把vuex里的数据保存到sessionStorage中

页面刷新的时候,监听浏览器刷新前事件,在浏览器刷新之前就把vuex里的数据保存到sessionStorage中,刷新成功后如果异步请求的数据未返回则直接获取sessionStorage的数据

4.3.3 Vuex持久化插件(vuex-persistedstate)

原理:将vuex的state存在浏览器存储中一份,刷新页面的 一瞬间,vuex数据消失,会去浏览器存储中拿回数据

vuex-persistedstate安装使用方法可以网上查资料:https://blog.csdn.net/weixin_46846007/article/details/131165731


回来我们的话题:但是一旦页面刷新,vuex的store的这个数据丢失了???

解决方法:需要同时也在localstorage里存储token数据,vuex的state的数据需要从localstorage获取

store/user.js
 export default {
  namespaced: true,
  state:() => ({
    token:localStorage.getItem('token'),
  }),
  mutations:{

    updateToken (state, token) {
      state.token = token
      // 存入 localStorage
      // localStorage.setItem('token', token)
      localStorage.setItem('token',token)
    },
  },
  actions:{},
  getters:{}
}

数据不会再丢失了~~OK

 

标签:axios,token,localstorage,import,vuex,store
From: https://www.cnblogs.com/mahmud/p/17655967.html

相关文章

  • pd.read_csv pandas.errors.ParserError: Error tokenizing data. C error: Expected
    df1=pd.read_csv(path1,encoding="utf-8",chunksize=50000,error_bad_lines=False)尽管提示:Warning(fromwarningsmodule):File"D:\Python37\lib\idlelib\run.py",line550exec(code,self.locals)FutureWarning:Theerror_bad_linesargu......
  • vue--day69---vuex
    1. vuex是什么概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。2. 什么时候使用Vuex1.多个组件依赖于同一状态2.来自不同组件的行为需要变更同一状态......
  • Cookie、Session及Token详解
    CookieCookie,有时也用其复数形式Cookies,类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息以加入购物车为例,每次浏览器请求后server都会将本次商品id存储在Cookie中......
  • smartbi token回调获取登录凭证漏洞
    2023年7月28日Smartbi官方修复了一处权限绕过漏洞。未经授权的攻击者可利用该漏洞,获取管理员token,完全接管管理员权限。于是研究了下相关补丁并进行分析。0x01分析结果依据补丁分析,得到如下漏洞复现步骤第一步,设置EngineAddress为攻击者机器上的http服务地址首先使用pythonflask......
  • mall :sa-token项目源码解析
    目录一、mall开源项目1.1来源1.2项目转移1.3项目克隆二、Sa-Toekn框架2.1Sa-Token简介2.2分布式后端项目的使用流程2.3分布式后端项目的使用场景三、源码解析3.1集成与配置3.1.1导入依赖3.1.2添加配置3.1.3异常处理3.1.4存储用户信息3.2登录认证3.2.1配置黑白名单3.......
  • Django自定义中间件验证用户token信息
    1.新建middleware.pyfromdjango.urlsimportreversefromrest_framework.responseimportResponsefromutils.tokenimportcheck_tokenfromdjango.httpimportJsonResponse,HttpResponseRedirectfromyshop.modelsimportMyUsertry:fromdjango.utils.de......
  • 传token给食物类,通过新写一个test.py去调用登录类和食物类
    #\libs\request_test.pyfromlibs.login_myimportLoginfromlibs.food_myimportFood#调用登录获得tokenl=Login()t=l.login(is_need_token=True)#将登录获得的token传递给食物模块f=Food()f.token=t#传token给整个食物类,这样整个食物类可以直接使用token;因为基......
  • Kettle实例(获取Token并带入请求接口拉取数据到本地)
    背景      近期工作中遇到许多需要协同的表单文档被放到云文档,那么我们本地做数据分析就需要先抽取云文档实时数据到本地数据库,根据接口文档我们需要先获取Token,再将返回值带到接口中发起请求拉取数据,因为在做数据仓库项目调度用到过Kettle,想到RESTclient组件可以完成这......
  • Vuex有哪几种属性?
    有五种,分别是State、Getter、Mutations、Actions、Modulesstate=>基本数据(数据源存放地)getters=>从基本数据派生出来的数据mutations=>提交更改数据的方法,是同步操作actions=> 用于异步操作和提交mutations,在actions中可以进行任何异步操作,最后再提交到mutations中......
  • JSON Web Tokens(JWT)
    JSONWebTokens(JWT)是一种用于身份验证和授权的开放标准。它可以在客户端和服务器之间安全地传输信息,并且非常适合以下场景:身份验证:JWT可以用于验证用户的身份。当用户登录后,服务器可以生成一个JWT并将其返回给客户端。客户端可以在后续的请求中将JWT作为身份验证凭证发送给服务器......