vue项目将token存在(vuex)store和localstorage中

文章目录

      • 一、准备工作和token
          • 1、准备工作
          • 2、介绍token用法
      • 二、创建storage,store,request
          • 1、src目录:
          • 2、封装storage(可选)
          • 3、创建store
          • 4、创建request
      • 三、配置代理,封装路由router、设置路由守卫,在main.js中引入router、store
          • 一、配置代理
          • 二、封装路由router,并设置路由守卫
          • 三、在main.js中引入router、store
      • 四、登录页面实际使用

适合小白 ❤

一、准备工作和token

1、准备工作
  • 了解(session,cookie)token
    Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。
    token 是在服务端产生的一串字符串,以作客户端进行请求的一个令牌。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌(除非设置了有效期)。

  • token 优点
    Token 完全由应用管理,所以它可以避开同源策略
    Token 可以避免 CSRF 攻击
    Token 可以是无状态的,可以在多个服务间共享
    减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

  • 安装vuex
    cnpm install vuex --save

2、介绍token用法

在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下:

1、第一次登录的时候,前端调后端的登陆接口,发送用户名和密码

2、后端收到请求,验证用户名和密码,验证成功,就给前端返回一个token

3、前端拿到token,将token存储到localStorage和vuex中,并跳转路由页面

4、前端每次跳转路由,就判断 localStroage 中有无 token ,没有就跳转到登录页面,有则跳转到对应路由页面

5、每次调后端接口,都要在请求头中加token

6、后端判断请求头中有无token,有token,就拿到token并验证token,验证成功就返回数据,验证失败(例如:token过期)就返回401,请求头中没有token也返回401

7、如果前端拿到状态码为401,就清除token信息并跳转到登录页面
————————————————
版权声明:本文为CSDN博主「sleepwalker_1992」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sleepwalker_1992/article/details/82974703


二、创建storage,store,request

1、src目录:

在这里插入图片描述
注:

  • 封装storage是可选的,不封装就用原生的呗;创建store是必须的
  • token一定要存在storage缓存中,否则刷新一下,store会重新被加载,token就没了;
  • 那存在store是不是多余了,这个也是为了数据统一管理吧,也是数据可视化,因为缓存中的数据代码中是看不见的~
2、封装storage(可选)
// 封装操作localstorage本地存储的方法  模块化var storage = {set(key, value) {localStorage.setItem(key, JSON.stringify(value));// localStorage.key = value;// localStorage[key] = value;},get(key) {return JSON.parse(localStorage.getItem(key));},getForIndex(index) {return localStorage.key(index);},getKeys(){let items = this.getAll();let keys = [];for (let index=0;index<items.length;index++){keys.push(items[index].key);}return keys;},getLength() {return localStorage.length;},getSupport() {return (typeof (Storage) !== "undefined") ? true : false;},remove(key) {localStorage.removeItem(key);},removeAll() {localStorage.clear();},getAll() {let len = localStorage.length;  // 获取长度let arr = new Array(); // 定义数据集for (var i = 0; i < len; i++) {// 获取key 索引从0开始var getKey = localStorage.key(i);// 获取key对应的值var getVal = localStorage.getItem(getKey);// 放进数组arr[i] = {'key': getKey,'val': getVal,}}return arr;}
}export default storage;
3、创建store

import Vue from 'vue'
import Vuex from 'vuex'
import storage from '@/model/storage'Vue.use(Vuex);
// 用Vuex.Store对象用来记录token
const store = new Vuex.Store({state: {// 存储tokentoken:"",userName:"" // 可选},getters: {getToken(state){return state.token || storage.get("token") || "";}},mutations: {// 修改token,并将token存入localStoragesetToken(state,token) {state.token = token;storage.set('token', token);console.log('store、localstorage保存token成功!');},delToken(state) {state.token = "";storage.remove("token");},// 可选setUserInfo(state, userName) {state.userName = userName;}},actions: {// removeToken: (context) => {// context.commit('setToken')// }},
});export default store;
4、创建request
import axios from 'axios'
import store from '@/store'
import router from '@/router'// create an axios instance
const service = axios.create({// index.js设置了代理(解决跨域) baseURL: "/invoice", // url = base url + request urltimeout: 5000, // request timeout
})//添加请求拦截器,若token存在则在请求头中加token,不存在也继续请求
service.interceptors.request.use(config => {// 每次发送请求之前都检测vuex是否存有token,放在请求头发送给服务器// Authorization是根据后端自定义字段config.headers.Authorization = store.getters.getToken;return config;},error => {console.log("在request拦截器显示错误:", error.response)return Promise.reject(error);}
);//respone拦截器
service.interceptors.response.use(response => {// 在status正确的情况下,code不正确则返回对应的错误信息(后台自定义为200是正确,并且将错误信息写在message),正确则返回响应return response.data.code == 200 ? response : Promise.reject(response.data.message);},error => { // 在status不正确的情况下,判别status状态码给出对应响应if (error.response) {console.log("在respone拦截器显示错误:", error.response)switch (error.response.status) {case 401://可能是token过期,清除它store.commit("delToken");router.replace({ //跳转到登录页面path: '/login',// 将跳转的路由path作为参数,登录成功后跳转到该路由query: { redirect: router.currentRoute.fullPath }});}}return Promise.reject(error.response.data);}
);export default service

三、配置代理,封装路由router、设置路由守卫,在main.js中引入router、store

一、配置代理

在这里插入图片描述

二、封装路由router,并设置路由守卫
/* eslint-disable */
import Vue from 'vue'
import Router from 'vue-router'
import Main from '@/main/index'import store from '@/store'
import storage from '@/model/storage'Vue.use(Router)const routes = [{path: '/',name: 'Main',redirect: '/login',// 某些页面规定必须登录后才能查看 ,可以在router中配置meta,将需要登录的requireAuth设为true,meta: {requireAuth: true,}},{path: '/login',component: () => import('@/views/login'),},{path: '/invoice',redirect: '/invoice',component: Main,},]},{path: '*',component: Main}
]const router = new Router({ routes: routes })// 设置路由守卫,在进页面之前,判断有token,才进入页面,否则返回登录页面
if (storage.get("token")) {store.commit("setToken", storage.get("token"));
}
router.beforeEach((to, from, next) => {// 判断要去的路由有没有requiresAuth// to.matched.some(r => r.meta.requireAuth) or to.meta.requiresAuthif (to.matched.some(r => r.meta.requireAuth)) {if (store.state.token) {next(); //有token,进行request请求,后台还会验证token} else {next({path: "/login",// 将刚刚要去的路由path(却无权限)作为参数,方便登录成功后直接跳转到该路由,这要进一步在登陆页面判断query: { redirect: to.fullPath }  });}} else {next(); //如果无需token,那么随它去吧}
});export default router
三、在main.js中引入router、store
import Vue from 'vue'
import App from './App'
import router from './router'import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css'
import store from '@/store'// 兼容ie
// import 'babel-polyfill';Vue.use(ElementUI);
Vue.config.productionTip = falsenew Vue({el: '#app',router,store,components: { App },template: '<App/>'
})

四、登录页面实际使用

只给出表单提交示例函数和依赖js

import { postLogin } from "@/api/login";submitForm(formName) {this.$refs[formName].validate(valid => {if (valid) {let that = this;// console.log('username',this.loginForm.username)// 通过校验规则后进入校验用户名密码是否正确// 没有后台接口可以自定义一个函数来模拟,替换postLoginpostLogin(this.loginForm.username, this.loginForm.password).then(res => {console.log(res);that.$store.commit("setToken", res.data.token);that.$store.commit("setUserInfo", res.data.account);this.$notify({title: "登录成功",type: "success",showClose: false,duration: 1000});setTimeout(() => {// 此时要判断/login后面的参数redirect,若无参数,进入主页;this.$router.push("/index");// 若有参数则参数为未有权限的那个路由,跳转到那个路由// this.$router.push(***); -- 具体要自己在这实现}, 1000);}).catch(error => {// 错误分为 status-请求错误 和 code-账号密码错误this.$message.error(error);console.log(error);});} else {// 不符合前端校验this.$message.error('format error:'+error);console.log('format error:',error);return false;}});}

上面依赖的@/api/login:

import request from '@/utils/request.js'  // 前面封装的request
// 在request中,设置了根路径/invoice,所以每一个请求都会自动在前面带上invoice;
// 由于在config中的index配置过了代理(监听)的路径也是/invoice,但凡遇到/invoice路径就会替换为target目标地址(后台接口根地址)
// 实现跨域,即不限于只能访问根路径为127.0.0.1下的地址
export function postLogin(account,password) {console.log(account,password)return request({url: '/login',method: 'post',params:{// 具体传参(键)要看后台要求account:account,password:password}})
}

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

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

相关文章

安卓手电筒_将价值10美元的手电筒砍入超高亮高级灯中

安卓手电筒If you’re looking for a bright flashlight without paying an arm and a leg this simple hack modifies a cheap $10 flashlight to be as bright as a $95 one. 如果您要寻找一个明亮的手电筒而又不用付胳膊和腿&#xff0c;这个简单的技巧就可以将便宜的10美元…

初识 scrapy 框架 - 安装

前面豆子学习了基本的urllib的模块&#xff0c;通过这个模块可以写一些简单的爬虫文件。如果要处理大中型的爬虫项目&#xff0c;urllib就显得比较low了&#xff0c;这个时候可以使用scrapy框架来实现&#xff0c;很多基本的处理在scrapy里面已经做好了。 首先来安装一下。推荐…

Vue使用Vuex一步步封装并使用store

文章目录一、安装Vuex依赖二、一步步封装store1. main.js中全局引入store仓库&#xff08;下一步创建&#xff09;2. this.$store3. this.$store.state4. this.$store.getters&#xff08;this. $store.state的升级&#xff09;5. this.$store.commit(mutations)6. this.$store…

linux自学(四)之开始centos学习,网络配置

上一篇&#xff1a;linux自学&#xff08;三&#xff09;之开启虚拟机 安装好镜像之后&#xff0c;重启之后需要登录&#xff0c;我这里直接是root账号直接登录的&#xff0c;注意&#xff1a;输入密码的时候不显示。 之后输入ifconfig最常用的命令来查看网卡信息&#xff0c;出…

k8s extender_Windows Home Server的Drive Extender的9种选择

k8s extenderNow that Microsoft has officially killed off the best part about Windows Home Server what can you do? Here are some alternatives for drive extender that you can use if you want to build a WHS of your own. 既然Microsoft正式取消了Windows Home Se…

为什么element的el-backtop会不管用,来看这里

<template>Scroll down to see the bottom-right button.<el-backtop target".page-component__scroll .el-scrollbar__wrap"></el-backtop> </template>把target指向你要产生“回到顶部”按钮的组件&#xff0c; 这个组件一定要是产生滚动条…

如何创建一份springboot的docker镜像

2019独角兽企业重金招聘Python工程师标准>>> FROM centos:7 ENV JAVA_HOME /usr/java/jdk1.7.0_55 ENV MAC_PUBLISH_PATH /home/app ENV LOG_PATH /var/log ENV PATH $JAVA_HOME/bin:$PATH ENV TIME_ZONE Asia/Shanghai COPY jdk-7u55-linux-x64.rpm /opt/ RUN mkd…

Xamarin.Android 开发中遇到旋转屏幕错误

错误信息 : System.NotSupportedException: Unable to find the default constructor on type App5.MyFragment. Please provide the missing constructor. 错误图片&#xff1a; 解决方法&#xff1a;干脆不让他旋转屏幕&#xff0c;当下QQ、微信等app都没有旋转等功能&#…

windows7黑屏修复_如何在Windows 10更新后修复黑屏

windows7黑屏修复RealVector/Shutterstock.comRealVector / Shutterstock.comSome Windows 10 PCs have been rebooting to a black screen after installing the June 2019 cumulative update from Windows Update. This seems scary at first, but luckily there’s a quick …

vue/cli4 创建vue项目选项详解

多版本创建项目一、vue-cli2.x二、vue-cli3.x三、vue-cli4.x1.查看 vue 版本&#xff1a; 项目中,找到package.json文件夹 找"dependencies"中的vue &#xff1b; 若无项目&#xff0c;在cmd中输入 where vue&#xff0c;cd到vue目录下输入 npm list vue &#xff0c…

rainmeter使用教程_如何使用Rainmeter在桌面上显示报价

rainmeter使用教程I’ve never really been a desktop gadgets and widgets type of person, but I often put an inspirational quote on my desktop wallpaper. Today we’ll show you how to do this using Rainmeter, no matter what wallpaper you switch to. 我从来没有真…

Some code changes cannot be hot swapped into a running virtual machine

java运行中修改代码不能改变立刻应用到本次运行中转载于:https://www.cnblogs.com/Pusteblume/p/10211110.html

JMeter扩展JMeter插件获取更多监听器

为了获取更多监听器&#xff0c;方便的监控系统及应用&#xff0c;有必要安装第三方插件 插件下载地址&#xff1a; https://jmeter-plugins.org/downloads/old/ http://pan.baidu.com/s/1gfC11yN 注&#xff1a;如果插件和软件版本不兼容&#xff0c;可能在开启Jmeter时会报错…

如何阻止Chrome(或Edge)接管媒体密钥

Google Chrome now has built-in support for media keys. Unfortunately, Chrome will take over your media keys and prevent them from controlling apps like Spotify when you’re watching YouTube, for example. Here’s how to make Chrome ignore your media keys. G…

开源性能测试工具JMeter快速入门(一)

目录一、JMeter简介二、JMeter功能介绍三、JMeter脚本四、关于JMeter小提示一、JMeter简介1.定义JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 1&#xff09;它可以用…

八重州8900如何解锁_八重贵族怪胎之路

八重州8900如何解锁Dealing with computers day in and day out can be a harrowing experience. In difficult times, or even when things are idle, finding some spirituality can help cope with the experience—Techies: I give you the Eightfold Noble Geek Path. 日…

赠与大学毕业生_出售,赠与或交易iPhone之前应该做什么

赠与大学毕业生A factory reset of your iPhone erases all of your content and settings, reverting it to a like-new state. However, there are a few extra steps you should take if you plan to get rid of your iPhone. iPhone的恢复出厂设置将删除所有内容和设置&…

powerpoint预览_如何放大和缩小PowerPoint演示文稿的一部分

powerpoint预览Microsoft PowerPoint lets you zoom in and out on a specific part of your PowerPoint slideshow, which can be handy both while editing and for drawing attention to important objects or ideas during the presentation. Here’s how to do it. Micros…

从Firefox控制您喜欢的音乐播放器

Do you love listening to music while you browse? Now you can access and control your favorite music player directly from Firefox with the FoxyTunes extension. 您喜欢在浏览时听音乐吗&#xff1f; 现在&#xff0c;您可以直接使用FoxyTunes扩展程序从Firefox访问和…

ms project 入门_Microsoft Project 2010入门

ms project 入门Would you like to keep your projects on track and keep track of how time and resources are used? Let’s take a look at Microsoft Project 2010 and how it can help you stay on top of your projects. 您想保持项目进度并了解如何使用时间和资源吗&…