vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)

vue+axios 前端实现登录拦截的两种方式

在使用Vue开发前端项目时,通常会使用axios进行后端接口调用,而在实现用户登录后,我们通常需要对未登录的用户进行拦截,以保护系统的安全性。接下来将讲解如何使用Vue+axios实现前端登录拦截的两种方式:路由拦截和http拦截。

方式一:路由拦截

步骤一:创建全局路由守卫

在Vue项目主入口文件中,通过VueRouter的beforeEach方法实现全局路由拦截,以下是示例代码:

router.beforeEach((to, from, next) => {
  const isLogin = localStorage.token ? true : false; // 判断用户是否登录
  if (to.path == "/login") {
    next();
  } else {
    // 未登录则跳转到登录页面
    isLogin ? next() : next("/login");
  }
});

Vue Router提供的beforeEach方法,用于拦截全局路由,可以在这个拦截器中编写自己的业务逻辑。在上述代码中,通过判断路由是否为登录路由,并通过缓存中的token判断用户是否登录,若未登录,则跳转至登录页面,反之则放行。

步骤二:在登录成功后设置token

在请求登录接口成功后,将返回的token保存至localStorage中,示例代码如下:

axios.post('XXX/login', {username, password}).then(res => {
    localStorage.token = res.data.token;
    // 跳转至首页
    this.$router.push('/');
}).catch(error => {
    console.log(error);
})

该代码用于发送登录请求,请求成功后将返回的token保存到localStorage中,以备全局路由守卫使用。另外,在保存成功后,通过this.$router.push('/')跳转至应用的主页或者/dashboard。

示例

在Vue项目中,我们可以将全局路由守卫写在main.js中,以下是一个简单示例:

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false;

// 全局路由拦截
router.beforeEach((to, from, next) => {
  const isLogin = localStorage.token ? true : false; // 判断用户是否登录
  if (to.path == "/login") {
    next();
  } else {
    isLogin ? next() : next("/login");
  }
});

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

方式二:HTTP拦截

步骤一:创建axios实例

在Vue项目中,我们通常需要对axios进行全局配置,以便在后续的代码中调用,通过以下示例代码,创建一个axios实例:

import axios from 'axios'

const instance = axios.create({
    baseURL: 'http://localhost:5000',
    timeout: 5000,
    headers: {
        'Content-Type': 'application/json; charset=utf-8'
    }
});

export default instance

该代码中,通过axios.create()创建一个axios实例,在创建时可以设置一些配置项,例如url携带的basePath、timeout、header信息等。

步骤二:设置HTTP请求拦截器

通过设置instanceinterceptors.request.use()方法,对请求进行拦截,示例代码如下:

import instance from './axios'

instance.interceptors.request.use(config => {
    const token = localStorage.token;
    token && (config.headers.Authorization = token);
    return config;
}, error => {
    return Promise.reject(error);
});

在该代码中,设置了请求拦截器,在请求发送前,拦截器会通过localStorage.token获取保存在本地的登录token,若token存在,则将该token添加至请求头中,这样在后端服务接收到请求后,可以从头部信息获取该用户的登录凭证。

步骤三:设置HTTP响应拦截器

在HTTP返回结果时,后端可能返回一些常见的错误码,例如401,即为用户未授权错误,此时我们需要对该错误进行拦截,并提示用户重新登录。以下示例代码用于拦截401错误:

import instance from './axios'

instance.interceptors.response.use(response => {
    return response;
}, error => {
    const { response } = error;
    if (response) {
        switch (response.status) {
            case 401:
              // 重新跳转到登录页面
              router.replace({
                path: '/login',
                query: {
                  redirect: router.currentRoute.fullPath
                }
              })
              break;
            case 500:
              // 服务器错误
              break;
            default:
              break;
          }
    }
    return Promise.reject(error);
});

在该代码中,设置了响应拦截器,在响应时,如果服务器返回401错误码,则会跳转到登录页面。其他错误码暂不处理。

示例

下面是一个使用vue+axios的登录拦截HTTP拦截器的完整示例:

import axios from 'axios'
import router from './router'

const instance = axios.create({
    baseURL: 'http://localhost:5000',
    timeout: 5000,
    headers: {
        'Content-Type': 'application/json; charset=utf-8'
    }
});

instance.interceptors.request.use(config => {
    const token = localStorage.token;
    token && (config.headers.Authorization = token);
    return config;
}, error => {
    return Promise.reject(error);
});

instance.interceptors.response.use(response => {
    return response;
}, error => {
    const { response } = error;
    if (response) {
        switch (response.status) {
            case 401:
              // 重新跳转到登录页面
              router.replace({
                path: '/login',
                query: {
                  redirect: router.currentRoute.fullPath
                }
              })
              break;
            case 500:
              // 服务器错误
              break;
            default:
              break;
          }
    }
    return Promise.reject(error);
});

export default instance

在代码中,我们除了创建了axios实例,设置响应和请求拦截器,还将router引入,并在响应拦截器的401错误处理中,通过router.replace()重定向至登录页面。

总结

综上所述,Vue + Axios 实现前端登录拦截的两种方式 (路由拦截和HTTP拦截)已经讲解完毕。根据具体情况,可以灵活选择适合的方式来控制页面的访问权限和登录拦截。通过以上两个实现方式,可以快捷并且简洁地保护 Web 应用程序的安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript中数组的排序、乱序和搜索实现代码

    下面是关于JavaScript中数组排序、乱序、搜索的完整攻略。 数组排序 sort()方法 sort()方法是 JavaScript 中的一个数组方法,用于对数组进行排序,该方法会改变原数组。sort()方法会将数组中的每个元素转化为字符串,然后通过比较它们的 Unicode 值(从左到右逐个比较对应的 ASCII 码值),来确定数组中元素的顺序。sort…

    JavaScript 2023年5月27日
    00
  • js调试系列 断点与动态调试[基础篇]

    JS调试系列:断点与动态调试(基础篇)是一篇介绍JavaScript调试的基础知识和调试技巧的文章。 本文主要介绍了调试中的两个基础概念——断点和动态调试,以及如何在Chrome浏览器中使用这两种调试方式来定位和解决JavaScript代码问题。 以下为本文的详细攻略: 断点调试 断点介绍 断点是指我们在代码某一处打上标记,当程序执行到这一处时会自动停下来,…

    JavaScript 2023年6月11日
    00
  • 详解JavaScript原型与原型链

    详解JavaScript原型与原型链 前置知识 在深入讲解JavaScript原型与原型链之前,需要了解以下概念: 对象 构造函数 实例 继承 原型 JavaScript中有一个对象,称为原型对象(prototype object),它指向一个JavaScript对象。每个JavaScript对象都有一个原型对象。 在对象定义时,可以通过Object.cre…

    JavaScript 2023年6月10日
    00
  • 才发现的超链接js导致网页中GIF动画停止的解决方法

    完整攻略如下: 问题背景 当我们在网页中添加一些超链接时,有时会发现网页中的GIF动画会停止播放,这是因为一些不合适的js代码导致了GIF动画的暂停。本攻略将详细介绍这个问题的解决方法。 发现问题 首先,我们需要确定是否存在这个问题。当我们添加了一个超链接,然后在网页中出现了GIF动画,观察动画是否会在超链接出现时暂停。如果动画暂停,那么就有可能是因为超链接…

    JavaScript 2023年6月10日
    00
  • JS实现的找零张数最小问题示例

    我来给你讲一下“JS实现的找零张数最小问题示例”的完整攻略。 算法思路 我们考虑使用贪心算法来解决这个问题。贪心算法的基本思路是,在每一步尽量选择最优的解决方案,直到得到全局最优解为止。我们可以按照面值从大到小的顺序,选择尽量多的面值最大的纸币,然后再逐步减小面值,直到凑够要找的钱数为止。这里需要注意的是,钞票的面值必须是能够整除较小面值的,因此需要提前将钞…

    JavaScript 2023年5月28日
    00
  • Javascript Date getUTCMilliseconds() 方法

    JavaScript 中的 getUTCMilliseconds() 方法用于获取 UTC 时间的毫秒部分。在本教程中,我们将详细介绍 getUTCMilliseconds() 方法的使用方法。 getUTCMilliseconds() 方法的基本语法如下: date.getUTCMilliseconds() 其中,date 是获取毫秒部分的 UTC 日期对…

    JavaScript 2023年5月11日
    00
  • 五种js判断是否为整数类型方式

    下面是”五种js判断是否为整数类型方式”的攻略。 一、用typeof判断 代码示例 function isInteger(num) { return typeof num === ‘number’ && num % 1 === 0; } 描述 通过typeof操作符可以判断变量的类型,如果是number类型,那么就可以继续判断是否为整数。利用…

    JavaScript 2023年6月10日
    00
  • JQuery以JSON方式提交数据到服务端示例代码

    先说一下什么是JSON格式数据,它可以被序列化成字符串并进行网络传输,而在服务端被反序列化成为一个对象。JSON数据格式对于前后端交互非常方便,而JQuery框架也为此提供了很好的支持。下面是一个示例代码,演示了如何使用JQuery将JSON格式的数据发送至服务端: //定义一个JSON数据 var data = { name: ‘John’, age: 2…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部