vue添加全局拦截器

Vue使用axios全局拦截器处理登录过期
本文介绍了如何在Vue项目中利用axios设置全局拦截器,主要用于处理请求错误和登录状态过期的情况。通过安装axios,创建axiosConfig.js配置文件,然后在main.js中引入并设置别名,实现当请求发生错误特别是登录过期时,自动跳转到登录页面。

vue添加全局拦截器

为了统一处理错误及配置请求信息可以设置拦截器,本文是登录过期设置,过期后跳到登录页

  1. 安装 axios , 命令: npm install axios --save-dev
  2. 在src目录的新建config文件夹,并在config目录下新建文件 axiosConfig.js ,内容如下

import axios from 'axios'
import { Message } from 'element-ui'//引用elementui的信息提示框,根据个人选择可以不用
import Router from '../router'

// Add a request interceptor
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config
}, function (error) {
// Do something with request error
Message.error({
message: '请求错误:' + error.message
})
return Promise.reject(error)
})

// Add a response interceptor
axios.interceptors.response.use(function (response) {
// console.log('response')
// Do something with response data
// console.log(response)
//返回参数是noLogin时,返回首页
if (response.data.flag === 'noLogin') {
Router.push('/')
Message.error({
message: '当前会话过期'
})
}
return response
}, function (error) {
// Do something with response error
let msg = error.message
if (error.response.status === 401) {
msg = '当前会话已过期。'
Router.push('/')
}
Message.error({
message: '响应错误:' + msg
})
return Promise.reject(error)
})
export default axios

3、 在main.js中进行引用,并配置一个别名来进行调用

import Axios from '@/config/axiosConfig'

Vue.prototype.$http = Axios

4、post请求格式

this.$http.post(url).then(res=>{
    console.log(res)
    }).catch(res=>{
 console.log(res)
})
### 实现 Vue全局拦截 iframe 为了实现在 Vue 项目中对 iframe 进行全局拦截并控制其行为,可以采用监听特定事件的方式。通过 JavaScript 和 Vue 生命周期钩子相结合的方法来达到目的。 #### 使用 MutationObserver 监控 DOM 变化 MutationObserver 提供了一种异步观察目标节点及其后代的变化的能力。这使得可以在任何地方动态加载或修改 iframe 后立即做出响应[^1]。 ```javascript // 创建 mutation observer 并配置要观察什么类型的变动 const observer = new MutationObserver((mutationsList) => { mutationsList.forEach(mutation => { if (mutation.addedNodes && mutation.addedNodes.length > 0) { Array.from(mutation.addedNodes).forEach(node => { if (node.tagName === 'IFRAME') { handleIframeLoad(node); } }); } }); }); function startObserving() { const targetNode = document.body; const config = { childList: true, subtree: true }; // 开始监控目标节点上的变化 observer.observe(targetNode, config); } function stopObserving() { observer.disconnect(); } ``` 当检测到新的 `iframe` 被添加时调用 `handleIframeLoad()` 函数处理逻辑: ```javascript async function handleIframeLoad(iframeElement) { try { await checkParentPageRefreshCondition(); // 自定义条件判断函数 let src = iframeElement.src; // 如果满足某些条件,则执行刷新操作或其他动作 window.location.reload(); console.log(`Intercepted and handled an iframe with source URL ${src}`); } catch(error){ console.error('Error handling iframe load:', error); } } ``` #### 结合 Vue Router 进行权限验证 对于需要登录或者其他前置条件才能访问的内容,在创建路由实例的时候可以通过设置 `meta` 字段来进行标记,并利用导航守卫完成相应的校验工作[^2]。 ```javascript import Vue from 'vue'; import Router from 'vue-router'; Vue.use(Router); export default new Router({ routes: [ { path: '/', name: 'home', component: Home, meta: { requiresAuth: false }, // 不需认证即可查看首页 }, { path: '/secure-page-with-iframe', name: 'SecurePageWithIframe', component: SecurePageWithIframeComponent, meta: { requiresAuth: true }, // 需要先登录才可以看到这个页面以及其中嵌入的 iframe }, ] }); ``` 接着在 main.js 或者其他合适的地方加入全局前置守卫: ```javascript router.beforeEach(async (to, from, next) => { const isAuthenticated = /* 获取当前用户的认证状态 */; if(to.matched.some(record => record.meta.requiresAuth)) { if (!isAuthenticated) { next({path: '/login'}); } else { next(); // 对于受保护路径启动 dom 观察器 setTimeout(() => { startObserving(); }, 500); // 延迟半秒确保视图已经渲染完毕再开始监视 } } else { next(); } }) ``` 这种方法不仅能够有效地管理 iframe 加载前后的交互流程,还可以与其他业务需求紧密结合,提供更加灵活的应用场景支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值