vuex实现token验证

一.应用需求

token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。

简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。

Token: token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示
——通俗讲,就是一个身份牌,服务器端生成的一串字符串,后台给前台一个token,前台通过token来进行判断是否是本人操作,后台同样验证token是否有效,是否是传给的那个token
——即所有的接口请求,请求后台数据都需要添加这个token,以此来证明你已经进来了,有能力进行相关的操作

二.实现步骤
1.获取token
——1.拿到那个后台给的登录接口,一般来讲,登录接口中会返回一堆数据,其中有用户名,密码,token,id等

this.axios.post(this.API.http+'/sys/mpTempLogin',{
          username:value
        }).then((res)=>{
        if(res.data.success){
        .......获取其中的token
        }
        }).then((err)=>{
        console.log(err)
	})

2.将token放在vuex中,方便调用
将token使用localStorage存储在本地
//登录页面

this.axios.post(this.API.http+'/sys/mpTempLogin',{
          username:value
        })
        .then((res)=>{
          if(res.data.success){
            console.log(res)
            this.token=res.data.result.token   //获取的toekn
            this.id=res.data.result.userInfo.id
            this.$store.commit('set_token',this.token)   //调用store中的获取token方法,并将token存在store中
            console.log(this.$store.state.token)
            }
            }

3.创建vuex,设置store.js,存储token等需要全局使用的变量
创建vuex文件夹,创建store.js
将token使用localStorage存储在本地
vuex/store.js
import store from '../vuex/store.js'使用store.js中的内容,必须在页面中引入此文件

//使用store.js中的变量::this.$store.state.token(store.js中的变量)
//使用store.js中的方法::this.$store.commit( ‘set_token’,this.token(需要的传值,没有就不传值) )
//store.js中的变量 只能通过store.js中的mutations中的方法才能进行修改和操作

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);

var state={
    count:1,
    token:'',
    idCard:'',

}

var mutations={
    //localStorage存储token
    set_token(state, token) {
        state.token = token
        localStorage.token = token
    },
    //localStorage删除token
    del_token(state) {
        state.token = ''
        localStorage.removeItem('token')
    },

}

const store=new Vuex.Store({
    state,
    mutations:mutations
})
export default store

4.使用axios中的拦截器,在每次请求接口时,都将token添加到请求api的头部
//在main.js中进行全局配置
main.js

//设置axios的请求拦截器,在发出请求前进行操作
axios.interceptors.request.use(config=>{
  if(localStorage.getItem('token')){    //如果token已经存储在本地了,代表是已经进行了登录,且登录成功
    config.headers[ 'X-Access-Token' ] =localStorage.getItem('token')     //此时将token添加到url的头部header中
    console.log('成功')
  }
  //取消请求操作
  //config.cancelToken=new axios.CancelToken((cancel)=>{
    //window._axiosPromiseArr.push({cancel})
  })
  return config;
},err=>{
  return Promise.reject(error);
});

//设置axios的响应拦截器,在响应后的数据进行操作,即处理token失效等问题
请求成功,已经到达200,将执行response,请求不成功,在200之后将执行error
//至于token失效的场景,需要和后台进行商量,如果后台是请求成功,但状态码是401等(后台自己定义的状态码)返回token失效的message,只要请求成功,就执行response这一模块。
//如果后台返回500,请求失败,并返回一个message信息,告诉token失效,此时将在error中进行操作
axios.interceptors.response.use((response)=>{

  return response
},function(error){
  console.log(error.response.data)
  let data=error.response.data
  switch (error.response.status){
    case 403:
      Toast({
        message: '拒绝访问',
        position: 'top',
        duration: 2000
      });
      break
    case 500:  //可以使用其他的提示框架,根据环境使用,MessageBox弹窗可执行promise操作,使在点击确定后执行某些操作
      if(data.message=='Token失效,请重新登录'){
        Toast({    
          message: '登录已过期,请重新登录',
          position: 'top',
          duration: 2000
        });
      }
      break
    case 404:
      Toast({
        message: '很抱歉,资源未找到',
        position: 'top',
        duration: 2000
      });
      break
    case 504:
      Toast({
        message: '网络超时',
        position: 'top',
        duration: 2000
      });
      break
    case 401:
      Toast({
        message: '未授权,请重新登录',
        position: 'top',
        duration: 2000
      });
  }
  return Promise.reject(error)
})
  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dev _

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值