前后端分离,如何解决跨域(代理模式)、路由拦截(进入页面需要登录)以及请求拦截(登录TOKEN失效)等问题(初学者)

前端时间项目需要发布一个较大的版本,工作比较忙,加了好多个晚上的班,感觉自己有点缺氧了。最近稍微闲下来了,顺便调休了三天,刚刚给家里来了个大扫除,看着这干干净净的小家,心里顿时舒服了很多。 在这里插入图片描述

下面进入正题(本文以vue项目为例)→

  • 首先,安装axios:
npm install axios
  • 然后在 main.js 里引入 axios,然后进行全局挂载在vue原型上
import axios from 'axios';
Vue.prototype.$axios = axios;

使用方式:

 this.$axios.post(api, this.form).then(res => {console.log(111, res)})

当然,这里还有另外一种方式让我们可以在全局直接使用axios

  • 首先,安装axios, vue-axios:
npm install --save axios vue-axios
  • 然后在 main.js 里引入 axios,然后使用 vueAxios进行全局挂载
import vueAxios from 'vue-axios'
Vue.use(vueAxios, axios);

使用方式:

Vue.axios.get(api).then((response) => {console.log(response.data)
})this.axios.get(api).then((response) => {console.log(response.data)
})this.$http.get(api).then((response) => {console.log(response.data)
})

在这里插入图片描述

跨域问题:
在vue或者react项目中,我们大多使用代理的方式来解决跨域问题

  • 首先,找到 config文件下的 index.js 文件,在proxyTable下加上以下代码
proxyTable: {'/apis': {// 测试环境target: 'http://192.168.0.113',  // 后端接口域名changeOrigin: true,  //是否跨域pathRewrite: {'^/apis': ''   //需要rewrite重写的,}}},

在这里插入图片描述
*tips:因为我们修改了配置文件,所以在这一步之后需要我们重启项目才可生效

接下来就是发送请求,可能我们对于上面刚加的代码不是很理解,比如说:
在这里插入图片描述
这个 '^/apis ’ 是什么意思?
我们仔细一看,他就像是一个正则表达式:^ 符号代表以什么开头,这里就是以 /apis 开头,当我们使用axios发送请求时:
在这里插入图片描述
他就会检测到这里的请求 api 为: ‘/apis/login’ ,是以 /apis 开头的路径,那他就会将我们的请求前缀替换成为 ‘http://192.168.0.113’

http://localhost:8888/apis/login
等同于:
http://192.168.0.113/login

路由拦截

我们的项目中很多页面是需要进行登录才能浏览的,但是如果我们每进入一个页面都去判断他是否有登录(Token),明显不是一个明智之举,所以我们需要一个公共的方法去处理这件事情。

以 vue-router 为例,我们知道 vue-router 具有两个全局守卫:

全局前置守卫:router.beforeEach((to, from, next) => {// ...
})to: Route: 即将要进入的目标 路由对象
from: Route: 当前导航正要离开的路由
next: Function: 一定要调用该方法来 resolve 这个钩子。全局后置钩子:
router.afterEach((to, from) => {// ...
})

在这里,我们正是要用到 router.beforeEach 这个钩子函数
让我们来打印康康 to 这个参数有什么东西:
在这里插入图片描述
其中里面有一个 mata 的对象,他代表了什么呐?
在这里插入图片描述
没错,正是它。我们给路径为 ‘/’ 的这个路由配置一个参数requireAuth

// 需要登录才能进入的页面可以增加一个meta属性
meta: { requireAuth: true
},

这样,我们就可以 to 这个参数里找到他了
在这里插入图片描述
相信讲到这里,你一定有了自己的实现思路了

// 判断是否需要登录权限 以及是否登录
router.beforeEach((to, from, next) => {console.log('to', to)const { meta } = to || {}const { requireAuth } = meta || {}// 即将进入的页面是否需要登录if(requireAuth) {// 判断是否有Token(一般用户登录之后,后端会返回给我们用户的Token, 我们将其存放下来,具体存			 到哪里,存储多长时间,根据你的需要来,这里我是存储在 localStorage 里)if(localStorage.getItem('NOV_TOKEN')) {// 记住,一定要调用next函数,router才能进行下去next()} else {//  需要登录却没有登录(无Token),重定向到 登录页next({path: '/login',})}} else {// 不需要登录,直接往下进行next()}})

在这里插入图片描述
请求拦截

上面,我们对路由进行了拦截,但是有时候虽然我们登录过,将Token已经存储在 localStorage 里了,但这也不能完全保证安全,因为 token 一般是具有时效的,登录(Token)失效后也需要重新登录。但我们怎么知道Token是否失效了呐?这就需要后端告诉我们了。当我们进入一个需要登录的页面,需要发送请求获取某些数据时,后端会先判断此人是否有登录,登录是否失效,如果失效,后端会返回给我们401登录失效code码。当我们接收到 401 code 码时,就需要重定向到登录页,引导用户进行登录。
那这些,就属于请求拦截的范畴了。
axios的官方文档给出了两个拦截方式:

// 添加请求拦截器
axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);});// 添加响应拦截器
axios.interceptors.response.use(function (response) {// 对响应数据做点什么return response;}, function (error) {// 对响应错误做点什么return Promise.reject(error);});

所以我们就可以在这里进行响应拦截了

// 请求响应拦截处理
axios.interceptors.response.use(response => {const { data: { code, message }  } = responseif ( code === '200') {return response;} else if (code === '401') {router.push('/login')} else {ElementUI.Message.error({message: message || '请求失败',type: 'warning'});}
}, function (error) {return Promise.reject(error)
})

在这里插入图片描述
关于这些axios请求,我们都是直接在main.js里进行相关处理的。当然,我们也可以对axios在进行一次封装,把请求相关的东西都放到里面去,这样代码更具有可读性和维护性。
首先,我们在src文件夹下面新建一个utils工具文件
在这里插入图片描述
在里面新建一个request.js文件,关于请求的信息我们就放到里面进行处理。

import axios from "axios";
import { Message, MessageBox } from "element-ui";
import store from "../store";
import { getToken, removeToken} from "./auth";
import { IDPHelper } from "./idp";// 创建axios实例
const service = axios.create({baseURL: process.env.BASE_API, // api的base_urltimeout: 15000,validateStatus: (status) => {return true;}
});// request拦截器
service.interceptors.request.use(config => {if (store.getters.token) {// config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改config.headers["token"] = getToken();}return config;},error => {// Do something with request errorconsole.log(error); // for debugPromise.reject(error);}
);// respone拦截器
service.interceptors.response.use(response => {const status = response.status;if (status >= 200 && status < 300) {return response.data;}switch (status) {case 401:MessageBox.confirm("你已被登出,请重新登录","确定登出",{confirmButtonText: "重新登录",cancelButtonText: "取消",type: "warning"}).then(() => {removeToken();router.push('/login')});break;case 403:MessageBox.confirm("你无权访问该页面,请申请权限再行访问","系统安全",{confirmButtonText: "回退",cancelButtonText: "继续留下",type: "warning"}).then(() => {window.history & window.history.back()});break;case 404:case 408:Message({message: "请求资源不存在!",type: "error",duration: 3 * 1000});break;case 500:case 502:case 504:default:Message({message: "服务器繁忙,请稍后重试!",type: "error",duration: 3 * 1000});break;}return Promise.reject("error");},error => {console.log("err" + error); // for debugMessage({message: error.message,type: "error",duration: 3 * 1000});return Promise.reject(error);}
);export default service;

使用:

在这里插入图片描述

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

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

相关文章

秒懂云通信:通信圈黑话大盘点

原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

从开源视角分析,搞定边缘计算云原生方案选型

作者 | lanliang来源 | 边缘计算社区头图 | 下载于视觉中国随着Kubernetes已经成为容器编排和调度的事实标准&#xff0c;各大公有云厂商都已经基于Kubernetes提供了完善的Kubernetes云上托管服务。同时也看到越来越多的企业、行业开始在生产中使用Kubernetes, 拥抱云原生。在各…

不太平凡的2020、平凡的我

这是去年12月31号的年终总结立下的flag。 古人常说&#xff1a;千里马常有&#xff0c;而伯乐不常有。 如今都是&#xff1a;flag常有&#xff0c;而实现不常有。2020年6月&#xff0c;在疫情的笼罩着&#xff0c;我们这一届 应届生 在无声无息中就成为了 毕业生。因为2019年7…

银行业数据治理之数据资产管理

前言&#xff1a; -更多关于数智化转型、数据中台内容请加入阿里云数据中台交流群—数智俱乐部 &#xff08;文末扫描二维码或点此加入&#xff09; -阿里云数据中台官网 https://dp.alibaba.com/index 随着2018年银保监发文《银行业金融机构数据治理指引》&#xff0c;各银监局…

架构简洁之道:从阿里开源应用架构COLA说起

导读&#xff1a;COLA 的主要目的是为应用架构提供一套简单的可以复制、可以理解、可以落地、可以控制复杂性的”指导和约束"。在实践中作者发现 COLA 在简洁性上仍有不足&#xff0c;因此给 COLA 做了一次“升级”&#xff0c;在这次升级中&#xff0c;没有增加任何新的功…

html、css、js、react、vue 文字一行一行显示出来

前端时间在做 年报&#xff0c;就不难涉及到 年报 具有的几大特性&#xff1a; 1、页面滑动特效 2、文字一行一行出现特效 3、页面内动画 等等 这片文章主要展示一下 文字一行一行出现特效 代码&#xff08;react 为例&#xff09; 先看效果图&#xff1a; 第一步&#xff…

哪家互联网公司涨薪最厉害?居然不是阿里腾讯

最近脉脉职言区有一条讨论火了&#xff1a;哪家互联网公司涨薪最厉害&#xff1f;按照拼多多员工的说法&#xff0c;应届毕业生可以拿比腾讯阿里高30%的薪资&#xff0c;而有工作经验的员工普遍薪资水平也高出业内30%~50%以上。而且在去年由于疫情众多企业降薪、甚至裁员的状况…

MongoDB 安装与配置~linux

文章目录一、 安装建议二、 安装步骤2.1. 下载2.2. 解压缩2.3. 重命名2.4. 配置环境变量2.5. 使其生效2.6. 配置MongoDB2.7. 启动MongoDB2.8. 网络安全组一、 安装建议 MongoDB 可以在mac/win/linux上安装&#xff0c;我个人建议在linux上安装会更好&#xff0c;这样测试起来更…

节省服务器成本50%以上!独角兽完美日记电商系统容器化改造实践

完美日记创立于2017年&#xff0c;这家公司上线不到两年即成为天猫彩妆销冠&#xff0c;2019年成为11年来第一个登上天猫双十一彩妆榜首的国货品牌&#xff0c;包揽天猫2019全年彩妆销冠&#xff1b;2020年4月成为首个亮相天猫超级品牌日的国货彩妆品牌&#xff0c;同时勇破彩妆…

浏览器从输入URL到页面渲染过程 —— 浏览器的进程与线程

之前我有总结过一篇经典面试题&#xff1a;浏览器从输入URL到页面渲染过程&#xff0c;接下里我将对某些知识点进行更细致的解析。 浏览器从输入URL到页面渲染过程 系列文章&#xff1a; &#xff08;二&#xff09;&#xff1a;浏览器从输入URL到页面渲染过程 ——页面渲染流…

MongoDB 的可视化管理工具~连接腾讯云MongoDB服务

不论是mysql或者redis或者es&#xff0c;我们都会使用远程的客户端工具来连接数据库server&#xff0c;那么目前的linux上锁安装的MongoDB就是server端&#xff0c;我们需要有一个客户端来进行可视化的管理&#xff0c;常用的可以使用Navcat来操作&#xff0c;当然使用其他的GU…

云原生时代业务架构的变革:从单体迈向Serverless

如今&#xff0c;各行各业都在谈数字化转型&#xff0c;尤其是新零售、传媒、交通等行业。数字化的商业形态已经成为主流&#xff0c;逐渐替代了传统的商业形态。在另外一些行业里&#xff08;如工业制造&#xff09;&#xff0c;虽然企业的商业形态并非以数字化的形式表现&…

冯诺依曼架构的 IO 鸿沟,谁能来填补?

作者 | 宋慧头图 | 下载于视觉中国随着AI技术、数据分析等领域兴起&#xff0c;数据变得越来越重要了&#xff0c;数据处理往往需要用到大量的内存&#xff0c;数据量爆发式增长让各种内存密集型应用层出不穷&#xff0c;如Redis数据库、SAP HANA企业核心系统。在CSDN 2019、20…

使用Git后10件你可能需要“反悔”的事

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; Git是目前世界上最优秀最流行的分布式版本控制系统&#xff0c;也是程序员们日常使用最频繁的工具之一&#xff08;几乎每天都…

SpringBoot 整合MongoDB

文章目录1. 引入依赖2. 在yml中添加配置3. 在启动类中开启mongodb在model中添加依赖&#xff0c;为什么在model中添加&#xff1f;因为会有映射的实体类MongoObject对应mongodb中的数据表对象&#xff1a;1. 引入依赖 <dependency><groupId>org.springframework.b…

浏览器从输入URL到页面渲染过程 ——页面渲染流程

之前我有总结过一篇经典面试题&#xff1a;浏览器从输入URL到页面渲染过程 &#xff0c;接下里我将对某些知识点进行更细致的解析。 浏览器从输入URL到页面渲染过程 系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;浏览器从输入URL到页面渲染过程 —— 浏览器的…

阿里发布2020农产品电商报告数字农业将成风口

完美日记创立于2017年&#xff0c;这家公司上线不到两年即成为天猫彩妆销冠&#xff0c;2019年成为11年来第一个登上天猫双十一彩妆榜首的国货品牌&#xff0c;包揽天猫2019全年彩妆销冠&#xff1b;2020年4月成为首个亮相天猫超级品牌日的国货彩妆品牌&#xff0c;同时勇破彩妆…

【干货】和你谈谈数据分析报告

前言&#xff1a; -更多关于数智化转型、数据中台内容请加入阿里云数据中台交流群—数智俱乐部 &#xff08;文末扫描二维码或点此加入&#xff09; -阿里云数据中台官网 https://dp.alibaba.com/index &#xff08;作者&#xff1a;数智从业者&#xff09; 在当今企业纷纷推动…

Vue3 安装axios使用报错:Uncaught TypeError: Cannot read property ‘use‘ of undefined

最近在学习Vue3&#xff0c;使用vue cli4搭建了一个demo项目&#xff0c;安装axios后&#xff0c;控制台报错&#xff1a; Uncaught TypeError: Cannot read property use of undefinedat eval (axios.js?be3b:59)at Module../src/plugins/axios.js (app.js:1229)at __webpac…

云原生五大趋势预测,K8s安卓化位列其一

作者 | 李响、张磊 Kubernetes 本身并不直接产生商业价值&#xff0c;你不会花钱去购买 Kubernetes 。这就跟安卓一样&#xff0c;你不会直接掏钱去买一个安卓系统。Kubernetes 真正产生价值的地方也在于它的上层应用生态。 “未来的软件一定是生长于云上的”&#xff0c;这是…