工作总结9:vue处理token

最开始后端来和我说 token 时候,
虽然装着很懂的样子,但当时我听的是一脸懵逼
之前学习的时候,根本没接触过token,
后来查了一些资料,终于明白了token 的原理,以及应用。

token 原理

token 的意思是 令牌, 就像是我们登陆某个账号时,会向你的安全令发送验证一样。
游戏验证
一个道理, 在前端处理登陆时,并非简单的验证账号密码是否正确, 而是发送给后台。
后台验证成功后, 会发送给我们一个 token。

token 大概长这样:
27d2da79303d4abaa271e71c2d6f3b48.d86c828583c5c6160e8acfee88ba1590

在我们登陆成功之后,后台会返回给我们token ,之后的每一次请求, 都要先验证token。

就是说,我们要将token 放到请求里。 token正确,才能执行下一步操作。
总而言之,使用token 会很安全。

处理 token

token 的处理思路很简单:
1.把冰箱门打开
2.向后台发送登陆请求,
3.接收到后台传来的 token
4.将 token 储存起来,
5.将 token 放到请求的 header 里
6.关上冰箱门

我这里储存 token 选择的是放到本地的Session Storage 里面,也用到了 vuex

vuex 需要提前配置好, 我这里使用的是单文件配置
vuex下载什么的就略过了…
还有 store/index.js 的文件配置

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {token: ''},mutations: {set_token (state, token) {state.token = tokensessionStorage.token = token},del_token (state) {state.token = ''sessionStorage.removeItem('token')}}
})

这里在 mutation 里设置了两个方法 set :设置 和 del :删除 两个方法。

具体操作

首先在登陆界面写一个有关登陆的函数,在其中发送ajax 请求,这里用的是 axios。

    login () {this.$axios({method: 'post',url: '/api/v1/teacher/login',params: {'t_num': this.t_num,'t_pwd': this.t_pwd}}).then(res => {console.log(res)let data = 'brear ' + res.data.access_tokenthis.$store.commit('set_token', data)if (store.state.token) {this.$router.push('/home')console.log(store.state.token)} else {this.$router.replace('/login')}}).catch(err => {console.log(err)})}

在这里要注意的是后台与我约定好了 ,在每次发送请求时,在token前面加一个 字符串和一个空格。
所以是这样 let data = 'brear ' + res.data.access_token
总之具体的需求 还是根据实际情况而定,这里只是储存token,以及登陆成功跳转到主页

还要注意的是我们这里用到的是 access_token ,有关 access_token 和 refresh_token ,有兴趣的同学 可以去百度一下。

这里成功获取到了token,但是之前提到过,我们每次发送请求时,都需要验证 token,
这就需要把 token 放到 header 里,就需要配置 ajax 拦截器。

还是axios…

我这里直接在 main.js 文件里配置

axios.defaults.headers.common['authorization'] = store.state.tokenaxios.interceptors.request.use(config => {if (store.state.token) {config.headers.common['authorization'] = store.state.token}return config
},
error => {return Promise.reject(error)
})axios.interceptors.response.use(response => {return response},error => {if (error.response) {switch (error.response.status) {case 401:this.$store.commit('del_token')router.replace({path: '/login',query: {redirect: router.currentRoute.fullPath}})}}return Promise.reject(error.response.data)}
)

这里用到的是 ajax 拦截器
在发送请求之前 先将 token 放到 header 里面 ,
如 axios.defaults.headers.common['authorization'] = store.state.token

还需要处理两个情况,
1.token 不存在,跳转到登陆页,重新获取 token
2.token 过期 ,如 error 返回 401 也是跳转到登录页, 重新获取token

关于路由 router

配置 token 时还需要判定跳转页面时 token 的授权。

还是直接上代码

router.beforeEach((to, from, next) => {if (to.matched.some(r => r.meta.requireAuth)) {if (store.state.token) {next()} else {next({path: '/login',query: {redirect: to.fullPath}})}} else {next()}
})

同样是在 main.js 中配置,当然还要安装vue-router …

同样是单文件
router
这里的 router/index.js 就不仔细说了…

重要的是配置

if (sessionStorage.getItem('token')) {store.commit('set_token', sessionStorage.getItem('token'))
}

这个写到 router/index.js 文件中,

在 main.js 里 :
引入 router…

import router from './router'

在每次跳转页面之前 判断是否需要登陆 后查看

router.beforeEach((to, from, next) => {if (to.matched.some(r => r.meta.requireAuth)) {if (store.state.token) {next()} else {next({path: '/login',query: {redirect: to.fullPath}})}} else {next()}
})

这里的
if (to.matched.some(r => r.meta.requireAuth))

需要在router/index 中配置:

        {path: '/paper',name: 'Paper',component: Paper,meta: {requireAuth: true}}

就是在需要 登陆 才能操作的页面里加入 meta

判断是否需要登陆

最后附上 main.js 的所有代码

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import Vuex from 'vuex'
import App from './App'
import router from './router'
import store from './store/index'
import axios from 'axios'Vue.prototype.$axios = axios
Vue.use(Vuex)
Vue.config.productionTip = false
axios.defaults.headers.common['Content-type'] = 'application/json'
axios.defaults.headers.common['authorization'] = store.state.tokenaxios.interceptors.request.use(config => {if (store.state.token) {config.headers.common['authorization'] = store.state.token}return config
},
error => {return Promise.reject(error)
})axios.interceptors.response.use(response => {return response},error => {if (error.response) {switch (error.response.status) {case 401:this.$store.commit('del_token')router.replace({path: '/login',query: {redirect: router.currentRoute.fullPath}})}}return Promise.reject(error.response.data)}
)
router.beforeEach((to, from, next) => {if (to.matched.some(r => r.meta.requireAuth)) {if (store.state.token) {next()} else {next({path: '/login',query: {redirect: to.fullPath}})}} else {next()}
})/* eslint-disable no-new */
new Vue({el: '#app',router,store,components: { App },template: '<App/>'
})

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

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

相关文章

从底层重学 Java 之两大浮点类型 GitChat链接

chat连接 https://gitbook.cn/gitchat/activity/5f03fdd3852a4f3686fb3366 简介 从底层&#xff0c;从原理&#xff0c;我们来重学一次 Java。两大 Java 浮点类 Double、Float 是我们比较常用的对象&#xff0c;他们的源码及实现是怎样的呢&#xff1f; 本系列秉承所有结论…

UVA455 - Periodic Strings

原题链接&#xff1a;https://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&category830&pageshow_problem&problem396 题意&#xff1a; 如果一个字符串可以由某个长度为k的字符串重复多次得到&#xff0c;则称该串以k为周期。例 …

从底层重学 Java 之 BigInteger 大整数 Gitchat连接

Gitchat连接 https://gitbook.cn/gitchat/activity/5f395a80aced402379f6a0ca 简介 从底层&#xff0c;从原理&#xff0c;我们来重学一次 Java。BigInteger 是大整数计算类&#xff0c;是BigDecimal用于存储大数属性的类型&#xff0c;BigDecimal中很多计算就是基于BigInte…

让我们聊聊秒杀这东西

万事皆有因 这段似乎都成我写blog标准开头。言归正转&#xff0c;公司以前业务涉及到秒杀&#xff0c;并且是白天从10点起到晚上10点每小时一次&#xff08;TT天天心惊肉跳的&#xff09;&#xff0c;周六还有个大礼包活动&#xff08;重量级&#xff0c;经常会出一些你意想不到…

工作总结11:vue获取数据接口

getAction(/deparment/list,{})第一个参数是请求的接口url&#xff0c;第二个参数是需要传的请求接口需要传的参数例如需要传page1和limit5&#xff0c;第二个参数就要像这样写{page:1,limit:5}

从底层重学 Java 之 Character 字符型 Gitchat连接

Gitchat连接 https://gitbook.cn/gitchat/activity/5f50804bbe67a5348a9b2c91 简介 从底层&#xff0c;从原理&#xff0c;我们来重学一次 Java。Character 是char&#xff08;字符&#xff09;的封装类&#xff0c;是String用于字符存储的类型&#xff0c;他的源码及实现是…

Day7: Linux基础片:系统监控

一下1&#xff0c;2&#xff0c;3&#xff0c;4分别代表截图中第一行&#xff0c;第二行&#xff0c;第三行&#xff0c;第四行表示的内容 top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。 当前时间&#xff0c…

工作总结12:封装组件

selectform组件 <!--封装部门选择的插件 需要的组件--> <template><el-select :value"value" placeholder"请选择所属部门" change"handleChange"><el-optionv-for"department in departments":key"depart…

Windows 环境下 Chrome浏览器崩溃“STATUS_INVALID_IMAGE_HASH”

问题 Windows环境下&#xff0c;新版的Chrome浏览器下载安装后&#xff0c;打开就报错&#xff0c;提示错误代码为“STATUS_INVALID_IMAGE_HASH”。重新打开、打开新标签页、刷新均无效。 解决 导致这个问题的原因是 Google 在79版本&#xff08;2019年12月20号左右&#xf…

工作总结13:vue官网封装组件

事件名 不同于组件和 prop&#xff0c;事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称。举个例子&#xff0c;如果触发一个 camelCase 名字的事件&#xff1a; this.$emit(myEvent) 则监听这个名字的 kebab-case 版本是不会有任何…

从底层重学 Java 之 Stream 初探 Gitchat连接

Gitchat连接 https://gitbook.cn/gitchat/activity/5f85696aad812d16b498848c 简介 从底层&#xff0c;从原理&#xff0c;我们来重学一次 Java。Stream 是JDK8中新引入的&#xff0c;方便了数据列表的过滤、投影、遍历等各种处理&#xff0c;他的源码及实现是怎样的呢&…

签到题

直接查看源代码 nctf{flag_admiaanaaaaaaaaaaa}转载于:https://www.cnblogs.com/maodun/p/6912628.html

从底层重学 Java 之 Stream 并行及标志 GitChat连接

GitChat连接 https://gitbook.cn/gitchat/activity/5f8fc6cd1f577d4d9f428562 简介 从底层&#xff0c;从原理&#xff0c;我们来重学一次 Java。Stream 是JDK8中新引入的&#xff0c;方便了数据列表的过滤、投影、遍历等各种处理&#xff0c;他的源码及实现是怎样的呢&…

工作总结16:多看官网

多看官网 https://cn.vuejs.org/v2/guide/components.html

201521123121 《Java程序设计》第14周学习总结

1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结多数据库相关内容。 数据库的基本特点 1、实现数据共享 数据共享包含所有用户可同时存取数据库中的数据&#xff0c;也包括用户可以用各种方式通过接口使用数据库&#xff0c;并提供数据共享…

Java操作Mongo bulkWrite批量入库

Mongo bulkWrite示例 public boolean insertBulk(String collectionName, JSONArray array) {MongoCollection<Document> collection db.getCollection(collectionName);List<InsertOneModel<Document>> documentList array.stream().map(item -> {Doc…

工作总结17:组件封装思想

就是把部门下拉框选择这部分变成一个组件&#xff0c;在用户创建的时候引入这样就可以把功能不相关代码模块化&#xff0c;以后也便于管理如果别的地方也要用到部门选择&#xff0c;可以直接再次引入&#xff0c;就不用重复写代码了

c#程序中使用quot;like“查询access数据库查询为空的问题

今天&#xff0c;在开发的过程中发现了一个特别奇怪的问题&#xff1a;access中like查询时候。在Access数据库中运行&#xff0c;发现能够查询出结果。这是在数据库上运行。select * from KPProj where KpName like *測试*&#xff0c;可是相同的语句在c#程序中却查询为空。这是…