第48章 抽离Axios拦截守及其全局变量定义

news2025/3/1 18:16:51

1 准备工作

1.1 重构src\store\index.js

import {

    createStore

} from 'vuex';

export default createStore({

    state: {

        //通过该全局变量,获取全局化存储的1个指定用户的令牌字符串。

        token: localStorage.getItem('Token') ? localStorage.getItem('Token') : '',

        //通过该全局变量,获取全局化存储的1个指定用户的1个指定令牌字符串的过期时间。

        expiresIn: localStorage.getItem('TokenExpiresIn') ? localStorage.getItem('TokenExpiresIn') : '',

    },

    getters: {},

    mutations: {

        //通过该方法把“TokenJwt”字符串,进行全局存储。

        saveToken: function(state, data) {

            state.token = data;

            localStorage.setItem("Token", data);

        },

        //通过该方法把1个指定用户的1个指定令牌字符串的过期时间进行全局化存储。

        saveExpiresIn: function(state, data) {

            state.token = data;

            localStorage.setItem("TokenExpiresIn", data);

        },

    },

    actions: {},

    modules: {}

})

1.2 重构src\views\LoginView.vue

<template>

    <el-form :model="formLogin" label-position="left" label-width="0px" class="demo-ruleForm login-container">

        <h3 class="title">系统登录</h3>

        <el-form-item prop="account">

            <el-input type="text" v-model="formLogin.account" auto-complete="off" placeholder="账号"></el-input>

        </el-form-item>

        <el-form-item prop="checkPass">

            <el-input v-model="formLogin.checkPass" auto-complete="off" show-password placeholder="密码"></el-input>

        </el-form-item>

        <el-form-item style="width:100%;">

            <el-button type="primary" style="width:100%;" @click="submitLogin">

                登录

            </el-button>

        </el-form-item>

    </el-form>

</template>

<script>

    import axios from 'axios';

    export default {

        data() {

            return {

                formLogin: {

                    account: 'admin@yourStore.com',

                    checkPass: '1',

                },

            };

        },

        methods: {

            async submitLogin() {

                let loginParams = {

                    email: this.formLogin.account,

                    password: this.formLogin.checkPass

                };

                let res = await axios.post('https://localhost:7239/Customer/Login', JSON.stringify(loginParams));

                console.log(res);

                let userToken = 'Bearer ' + res.data.response.token;

                this.$store.commit("saveToken", userToken);

               

                //1个指定用户的1个指定令牌字符串的过期时间进行全局化存储。

                var curTime = new Date();

                var expiresIn = new Date(curTime.setSeconds(curTime.getSeconds() + res.data.response.expiresIn));

                this.$store.commit("saveExpiresIn", expiresIn);

               

                if (res.status == 200) {

                    let token = localStorage.getItem('Token');

                    if (token === null || token === '') {

                        await this.$router.replace(this.$route.query.redirect ? this.$route.query.redirect :"/Login");

                    }

                    await this.$router.replace(this.$route.query.redirect ? this.$route.query.redirect : "/");

                } else {

                    this.$message.error(res.msg);

                }

            },

        },

        mounted() {

            //Token字符串添加到Header拦截守卫。

            axios.interceptors.request.use(

                config => {

                    if (localStorage.getItem('Token')) {

                        config.headers.Authorization = localStorage.getItem('Token');

                    }

                    return config;

                },

                error => {

                    return Promise.reject(error);

                });

        },

    }

</script>

2 抽离Axios拦截守及其全局变量定义:src\common\http.interceptor.js

import axios from 'axios';

import router from '../router/index'

//实例化拦截守卫实例。

const axiosInterceptor = axios.create({

    baseURL: 'https://localhost:7239/', // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL

    timeout: 60000, // 请求超时时间毫秒

    //withCredentials:必须设定为false,或不对“withCredentials”进行设定,则否会出现异常:

    //Access to XMLHttpRequest at 'https://localhost:7239/Role/Index' from origin 'http://localhost:8080'

    //has been blocked by CORS policy: Response to preflight request doesn't pass access control

    //check: The value of the 'Access-Control-Allow-Credentials' header in the response is ''

    //which must be 'true' when the request's credentials mode is 'include'.

    //The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

    withCredentials: false, // 异步请求携带cookie

    headers: {

        'Content-Type': 'application/json',

        'token': 'your token',

        'X-Requested-With': 'XMLHttpRequest',

    },

});

//通过拦截守卫实例,把Token令牌字符串添加到Header字典实例中,从而授权指定用户有权访问指定页面。

axiosInterceptor.interceptors.request.use(

    config => {

        if (localStorage.getItem('Token')) {

            config.headers.Authorization = localStorage.getItem('Token');

        }

        return config;

    },

    error => {

        return Promise.reject(error);

    }

);

//通过拦截守卫实例在错误产生时获取对应的状态码,并根据对应状态码跳转到指定页。

axiosInterceptor.interceptors.response.use(

    (config) => {

        return config;

    },

    async error => {

        let statusErrorInfo = {

            success: false,

            message: "错误"

        };

        if (error.response?.status === 400) {

            statusErrorInfo.message =

                `${error.response?.status}:由于前端所发送的请求中有语法错误,服务器()端不能解析该请求或解析请求时产生错误,从而导致服务器()端已处理前端所发送的请求失败。`;

            console.log(statusErrorInfo.message);

            return await router.replace(router.redirect ? router.redirect : "/Login");

        } else if (error.response?.status === 401) {

            statusErrorInfo.message =

                `${error.response?.status}:由于用户未执行登录操作,所以没有权限访问当前页面。`;

            var curTime = new Date();

            var expiresIn = new Date(Date.parse(window.localStorage.expiresIn));

            //如果1个指定用户的1个指定令牌字符串已经过期。

            if (curTime > expiresIn) {

                statusErrorInfo.message =

                    `${error.response?.status}:由于指定用户的Token令牌字符串已经过期,所以没有权限访问当前页面。`;

            }

            console.log(statusErrorInfo.message);

            return await router.replace(router.redirect ? router.redirect : "/Login");

        } else if (error.response?.status === 403) {

            statusErrorInfo.message =

                `${error.response?.status}:该指定用户虽然已经执行登录操作,但该用户没有访问当前页面的权限。`;

            console.log(statusErrorInfo.message);

            return await router.replace(router.redirect ? router.redirect : "/Login");

        } else if (error.response?.status === 422) {

            statusErrorInfo.message =

                `${error.response?.status}:由于前端所发送的请求中所携带的参数实例与服务器()端中对应的API方法所需要的参数实例不匹配,从而导致服务器()端已处理前端所发送的请求失败(response)`;

            console.log(statusErrorInfo.message);

            return await router.replace(router.redirect ? router.redirect : "/Login");

        } else if (error.response.status >= 500) {

            statusErrorInfo.message =

                `${error.response?.status}:服务器()端中对应的API方法在处理前端所发送的请求时产生错误,服务器()API方法未能完成前端所发送的请求,从而导致服务器()端已处理前端所发送的请求失败(response)`;

            console.log(statusErrorInfo.message);

            return await router.replace(router.redirect ? router.redirect : "/Login");

        }

        if (error.response.status >= 505) {

            statusErrorInfo.message =

                `${error.response?.status}:由于服务器()端不支持前端所发送的请求的HTTP协议的版本,从而导致服务器()端已处理前端所发送的请求失败(response)`;

            console.log(statusErrorInfo.message);

            return await router.replace(router.redirect ? router.redirect : "/Login");

        }

        return Promise.reject(error);

    }

);

export default axiosInterceptor

3 重构端管理首页:src\views\WelcomeView.vue

<template>

    <h1>WelcomeView-----Amin</h1>

</template>

<script>

    import axiosInstance from '../common/http.interceptor.js';

    export default {

        data() {

            return {};

        },

        methods: {

            async getHomeAdminIndex() {

                let res = await axiosInstance.get('HomeAdmin/Index');

                console.log(res.data);

            },

        },

        async mounted() {

            await this.getHomeAdminIndex();

        },

    };

</script>

<style scoped lang="scss">

</style>
4 调试

 

 

 对以上功能更为具体实现和注释见:230221_010shopvue(抽离Axios拦截守及其全局变量定义)。

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

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

相关文章

CHAPTER 3 Web Server - httpd配置(二)

Web Server - httpd配置二3.1 httpd配置3.1.1 基于用户的访问控制3.1.2 basic认证配置示例&#xff1a;1. 添加用户2. 添加网页文件3. 定义安全域4. 修改父目录权限5. 访问效果6. 在配置文件中定义一个".htaccess"隐藏文件7. 添加组3.1.3 虚拟主机1. 构建方案2. 基于…

Storage

WebStorage主要提供了一种机制&#xff0c;可以让浏览器提供一种比cookie更直观的key、value存储方式&#xff1a; localStorage&#xff1a;本地存储&#xff0c;提供的是一种永久性的存储方法&#xff0c;在关闭掉网页重新打开时&#xff0c;存储的内容依然保留&#xff1b;…

TCP/IP网络协议族分成及其每层作用

1、可以分为应用层、传输层、网络层、链路层 2、各层的作用 应用层(可以想象成是快递打包过程) 决定了向用户提供应用服务时通信的活动&#xff0c;将要进行的操作或者数据进行一个打包。 传输层&#xff08;可以理解为选择顺丰、圆通等快递公司&#xff09; 提供数据传输的方…

从混沌到清晰,阿里全球商品类目域建设思考

作者&#xff1a;丁浩然 阿里全球化业务平台团队 商品是电商产品体系核心之一&#xff0c;类目则是商品模型核心之一&#xff0c;类目系统提供的基础业务数据贯穿了整个电商体系。本文将为大家分享商品类目域在全球化过程中的建设与思考。 众所周知&#xff0c;商品是电商产品体…

vue后台管理系统项目-table选择多行数据分页列表、一键全选重置功能

table选择多行数据 功能介绍&#xff1a; 1.列表分页功能&#xff1b; 2.一键全选&#xff0c;选中列表所有数据&#xff1b; 3.全选&#xff0c;选中当前页数据&#xff1b; 4.重置&#xff0c;清除选中状态&#xff1b; 5.列表搜索查询&#xff1b; 效果&#xff1a; 1.列表分…

剑指 Offer 28. 对称的二叉树

剑指 Offer 28. 对称的二叉树 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 请实现一个函数&#xff0c;用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样&#xff0c;那么它是对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 但是下…

项目管理中,如何制定一个好的项目计划?

项目计划&#xff0c;是一个项目的起点。计划不清晰&#xff0c;执行力再强也只会让项目跑偏。 制定一个好的项目计划有哪些要点&#xff1a; 1、确定目标 项目目标是项目所要达到的期望结果&#xff0c;拥有明确的目标能够帮助我们做好规划&#xff0c;用有效的方式做正确…

一文带你看透前端世界里的日期时间,对就是Date

很高兴我们能够通过不同空间&#xff0c;不同时间&#xff0c;通过这篇博客相识&#xff0c;那一定是一种缘分&#xff0c;一种你和狗哥的缘分。今天我希望通过这篇博客对我所熟知的前端世界里的日期时间做一个汇总&#xff0c;不止是代码上的汇总哦&#xff01; 目录 一、时区…

​一致魔芋在北交所上市:市值突破11亿元,吴平夫妇为实控人​

2月21日&#xff0c;湖北一致魔芋生物科技股份有限公司&#xff08;下称“一致魔芋”&#xff0c;BJ:839273&#xff09;在北京证券交易所上市。本次上市&#xff0c;一致魔芋的发行价为11.38元/股&#xff0c;发行1350万股&#xff0c;募资总额约为1.54亿元。 本次发行后&…

【语音之家】AI产业沙龙—动手体验语音AI开发利器 - NVIDIA NeMo代码实战

由CCF语音对话与听觉专委会 、中国人工智能产业发展联盟&#xff08;AIIA&#xff09;评估组、NVIDIA、语音之家、希尔贝壳共同主办的【语音之家】AI产业沙龙—动手体验语音AI开发利器 - NVIDIA NeMo代码实战&#xff0c;将于2023年2月28日19:00-20:30线上直播&#xff0c;同时…

详解matplotlib的color配置

详解matplotlib的color配置 Matplotlib可识别的color格式 格式举例RGB或RGBA&#xff0c;由[0, 1]之间的浮点数组成的元组&#xff0c;分别代表红色、绿色、蓝色和透明度(0.1, 0.2, 0.5), (0.1, 0.2, 0.5, 0.3不区分大小写的十六进制RGB或RGBA字符串。‘#0f0f0f’, ‘#0f0f0f…

图像质量的评价指标【PSNR/SSIM/LIPIS/IE/NIE/Prepetual loss】

前言 做插帧这么久了&#xff0c;这几个指标还没系统的研究过&#xff0c;这次开一个博客写下这几个指标的区别 这里贴一个比较全的评价指标的库https://github.com/csbhr/OpenUtility/tree/c9cf713c99523c0a2e0be6c2afa988af751ad161 以以下两张图为例 预测图片 真实图片 …

el-form表单初始化赋值表单dataForm,,校验有问题,校验必填的也校验成功了

大家好啊,今天写表单发现我直接赋值对象 导致初始化校验必填校验成功以及validator校验有误的问题我的其企业名称 在初始化的时候 竟然都校验了 并且看起来像校验成功我在点击下一步的时候validator的时候&#xff0c;竟然也是校验成功&#xff0c;也不提示必填的错误最后检查我…

用 tensorflow.js 做了一个动漫分类的功能(一)

前言&#xff1a;浏览某乎网站时发现了一个分享各种图片的博主&#xff0c;于是我顺手就保存了一些。但是一张一张的保存实在太麻烦了&#xff0c;于是我就想要某虫的手段来处理。这样保存的确是很快&#xff0c;但是他不识图片内容&#xff0c;最近又看了 mobileNet 的预训练模…

【Kafka】三.Kafka怎么保证高可用 学习总结

Kafka 的副本机制 Kafka 的高可用实现主要依赖副本机制。 Broker 和 Partition 的关系 在分析副本机制之前&#xff0c;先来看一下 Broker 和 Partition 之间的关系。Broker 在英文中是代理、经纪人的意思&#xff0c;对应到 Kafka 集群中&#xff0c;是一个 Kafka 服务器节…

Blazor入门100天 : 身份验证和授权 (4) - 自定义字段

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 本节源码 https://github.com/…

数据备份学习笔记2

Linux实现本地备份的命令&#xff1a; mkdir -p /root/backup/date "%Y-%m-%d" tar -zcvPf /root/backup/date "%Y-%m-%d"/test20230221.tar.gz /root/test20230221/ 我们再看下tar命令选项&#xff1a; tar -czvf txt3.tar.gz txt3 tar -xvf txt4.tar.g…

二叉查找树(C++)

背景&#xff1a; 最近我要学习二叉平衡树了&#xff0c;在学习二叉平衡树之前&#xff0c;我需要学会二叉搜索树&#xff0c;因为二叉平衡树就是根据二叉搜索树的思想进行优化的。 二叉查找树简介&#xff1a; 二叉查找树是什么呢&#xff1f;&#xff08;也叫二叉搜索树&…

国产无线蓝牙耳机哪个好?2023国产无线蓝牙耳机排行

随着蓝牙耳机的快速发展&#xff0c;近几年国产蓝牙耳机更是呈指数式爆发&#xff0c;越来越多的国产蓝牙耳机品牌被人们看到、认可。那么&#xff0c;国产无线蓝牙耳机哪个好&#xff1f;下面&#xff0c;我来给大家推荐几款国产蓝牙耳机&#xff0c;一起来看看吧。 一、南卡…

C语言实现动态管理通讯录信息系统(静态通讯录plus版)

文章目录前言&#xff1a;一.动态管理思想1.通讯录结构体声明发生变化2.通讯录结构体初始化发生变化3.通讯录能够动态增容4.通讯录销毁数据二.优化通讯录可持续读写信息1.保存通讯录中的信息到文件中2.加载文件信息到通讯录中三.源码1.text.c2.contact.c3.contact.h前言&#x…