Vue使用token进行登录验证和拦截

Sotellmeastoryy Sotellmeastoryy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

目录

  • 1. 技术概述
  • 2.技术详述
  • 流程图
  • 实现步骤
  • 3.问题和解决过程
  • 4. 总结
  • 5.参考文献、参考博客

1. 技术概述

网页中的很多页面在访问之前都需要登录,如果用户没登录,需要跳转到登录页面,因此需要对用户的登录状态进行判断和拦截,这里主要用token的方式实现。

2.技术详述

流程图

在这里插入图片描述

实现步骤

这里仅说明前端的实现。
(1)首先在定义路由时(router.js)需要添加一个字段:requireAuth,用于判断访问这个路径是否需要经过登录。

{
    path: '/community',
    name: 'Community',
    meta:{
      requireAuth:true
    },
    component: () => import('@/views/admin/community')
  },

(2) 在项目中的store.js或store/index.js文件中添加存储和删除token的全局方法。

export default new Vuex.Store({
  state: {
    // 登陆状态
    isLogin: '0',
    //token存储
    token:localStorage.getItem('token') ? localStorage.getItem('token'):'', 
  },
  mutations: {
    $_setToken(state, value) { // 设置存储token
      state.token = value;
      localStorage.setItem('token', value);
    },
    $_removeStorage(state, value){  // 删除token
        localStorage.removeItem('token');
    },
  }
})

(3) 在登录页面调用登录接口的方法中,从后端返回的数据获取token并存储在localStorage中。

// 登陆请求
      this.$axios({
      url:'/admin/login',
      method:'post',
      params:{
        username:this.username,
        password:this.password
      }
    }).then((response) =>{ 
      //console.log(response.data)
      // 登录成功
      if(response.data.code==200){
        //console.log(response.data.data.token)
        this.success();
        this.$store.commit('$_setToken', response.data.data.token);
        console.log(window.localStorage.token)
        this.$router.push('/baseState')
      }else{
        this.$message.error("账号或密码错误");
      }
    }).catch((error) =>{
      this.$message.error("登录失败,请检查网络情况或稍后重试");
    })

(4) 在main.js中添加拦截器,并在请求头中添加token,使每次的请求中都带有token。主要用到了vue-router的钩子函数**beforeEach()**。

// http request 拦截器
//请求在到达服务器之前,先会调用use中的这个回调函数来添加请求头信息
axios.interceptors.request.use(config => {
  console.log(window.localStorage.getItem("token"))
  //为请求头对象,添加token验证的Authorization字段
  config.headers.token = window.localStorage.getItem("token")
  return config
})

//登录拦截
router.beforeEach((to,from,next)=>{
  console.log(to.meta.requireAuth)
  console.log(window.localStorage.token)
  if (to.meta.requireAuth) {
//requireAuth若为true,则该路由需要判断是否登录
    if (window.localStorage.token) {
      next();
    }
    else {
      next({//返回登录页面
        path: '/',
        query: {redirect: to.fullPath}
      })
    }
  }
  else {
    next();
  }
})

new Vue({
  axios,
  router,
  store,
  render: h => h(App)
}).$mount('#app')

可以在开发者工具中查看是否成功添加token到请求头。

在这里插入图片描述


(4) 退出登录时,在相应方法中清除token,并返回登录页面。

methods:{
    // 退出登录
    logout(){
      window.localStorage.removeItem('token')
      this.$router.push('/')
    }

3.问题和解决过程

在main.js添加拦截器后不起作用,但仔细检查后发现代码是正确的,token也有存入,但是直接修改路由还是可以跳转,原因是Vue生命周期的问题,把添加拦截器的代码放在了vue实例创建代码的后面。

解决:把new Vue...这段代码放在添加拦截器代码的最后。

在这里插入图片描述

4. 总结

vue实现登录验证和拦截的整个过程比较清晰,步骤也很明确,但遇到问题时还是需要一步步地查找问题代码,耐心解决。

5.参考文献、参考博客

简单实现vue中的登录拦截
vue token的简单理解和使用

...全文

相关推荐

Vue中登录验证成功后保存token,并每次请求携带并验证token操作

主要介绍了Vue中登录验证成功后保存token,并每次请求携带并验证token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

weixin_38711643

vue 实现axios拦截、页面跳转和token 验证

主要介绍了vue 实现axios拦截、页面跳转和token 验证,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38614484

vue路由拦截器和请求拦截器知识点总结

路由拦截器 已路由为导向 router.beforeEach((to,from,next)=>{ if(to.path=='/login' || localStorage.getItem('token')){ next(); }else{ alert('请重新登录'); next('/login'); } }) 请求拦截器 当发送请求时才会触发此功能 axios.interceptors.request.use(function (config) { let token = window.localStorage.getItem("token"); i

weixin_38501363

详解vue项目中使用token的身份验证的简单实践

主要介绍了vue项目中使用token的身份验证的简单实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

weixin_38659622

vue路由导航守卫和请求拦截以及基于node的token认证的方法

什么时候需要登录验证与权限控制 1、业务系统通常需要登录才能访问受限资源,在用户未登录情况下访问受限资源需要重定向到登录页面; 2、多个业务系统之间要实现单点登录,即在一个系统或应用已登录的情况下,再访问另一个系统时不需要重复登录;在登录过期或失效时,需要重定向到登录页面 如何使用路由守卫 定义一个index.js页面用来定义页面的路由,代码如下: import Vue from 'vue' import Router from 'vue-router' import blogIndex from '@/views/index' import loginComponent from

weixin_38606656
评论
收藏 已收藏
分享
返回顶部