element拦截器使用代码

本文介绍了在Vue.js项目中如何使用Axios进行全局配置,包括设置请求和响应拦截器,处理加载效果、token验证及401错误处理。同时,展示了如何实现前端路由的前置和后置导航守卫,进行页面加载进度模拟、权限验证和页面跳转控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请求拦截.响应拦截

// 导入 axios
import axios from 'axios'
// 导入组件库
import { Loading } from 'element-ui'

import router from '../router/index'

// 全局挂载axios
axios.defaults.baseURL = 'http://www.liulongbin.top:3008'

// 全局挂载 - 请求拦截器
let fullScreenLoading
axios.interceptors.request.use(function (userinfo) {
  if (userinfo.url.startsWith('/my')) {
    userinfo.headers.Authorization = localStorage.getItem('token')
  }
  // 展示 loading 效果
  fullScreenLoading = Loading.service({
    text: '拼命加载中',
    fullscreen: true,
    background: 'rgba(0, 0, 0, 0.8)'
  })
  return userinfo
}, function (error) {
  return Promise.reject(error)
})

// 全局挂载 - 响应拦截器
axios.interceptors.response.use(function (response) {
  // 隐藏 loading 效果
  fullScreenLoading.close()
  return response
}, function (error) {
  // 响应失败会进入当前函数
  // 如果本地token过期.则删除
  // 如果响应状态码是 401,则强制跳转到登录页面
  if (error.response.status === 401) {
    localStorage.removeItem('token')
    router.push('/login')
  }
  // 隐藏 loading 效果
  return Promise.reject(error)
})
// 导出axios
export default axios
import axios from 'axios'
import { Message } from 'element-ui'
import Store from '../store'
import Router from '../router'
const _axios = axios.create({
  baseURL: process.env.VUE_APP_BASE_API
})

// 请求拦截
_axios.interceptors.request.use(
  config => {
    if (Store.state.user.token) {
      config.headers.Authorization = `Bearer ${Store.state.user.token}`
      console.log(`Bearer ${Store.state.user.token}`, '请求头')
    }
    return config // 成功
  },
  // Promise 返回数据
  error => {
    return Promise.reject(error) // 错误
  })

// 响应拦截
_axios.interceptors.response.use(res => {
  // 成功处理提示信息
  if (res.data.success) {
    return res.data
  } else {
    // 错误信息提示
    Message.error(res.data.message)
    // 这里是promise方法的失败执行结果
    return Promise.reject(res.data.mesaage)
  }
},
error => {
  // 当出现token失效的时候会报错401
  // 做一个401的统一拦截处理.
  // 1.清除token
  // 2.清除用户信息
  // 3.提示错误信息
  // 4.跳转至登录页面
  if (error.response && error.response.status === 401) {
    // Store.commit('user/setToken', '')
    // Store.commit('user/setUserinfo', '')
    Store.commit('user/logout')
    Message.error(error.response.data.message)
    // 路由传参 当规则校验判断提示401或者token失效过时时.
    // 通过拿到 整段路径然后使用#分割截取第二部分.
    Router.push('/login?abcdefg=' + window.location.href.split('#')[1])
  }
  return Promise.reject(error)
})

export default _axios

导航守卫

// 前置导航守卫
import router from './router'
import Store from './store'
// 用来模拟加载页面进度条,并不是真的加载.

// 下包
// 导入+css样式
// 使用
// NProgress.start()
// NProgress.done()
// 模拟加载进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 设置白名单.不需要验证就可以访问的路径
// const whiterr = ['/login', '/404']

// 前置守卫  to去哪  from从哪来  next放行通过
router.beforeEach(async(to, from, next) => {
  NProgress.start()
  // 唯一出口next
  // 通过判断是否有token
  // 如果有.再判断去哪里.
  // 当有token的时候如果去的是登录页面或者其他页面则直接默认出口为/ 默认页面.
  // 但是只是有token容易被人携带非正确token混入.那么需要再次判断唯一值.
  // 否则如果有ID则通过去默认页面
  // 没有ID则自动调用发起请求获取ID.再去默认页面.
  // 者个时候.因为发起的请求是异步任务.会延迟执行.那么它后面的代码会先执行.所以我们需要await来设置阻塞.等待异步任务完成. await必须配合async一起使用
  if (Store.state.user.token) {
//这里设置的是判断字体大小写.
    if (to.path.toLowerCase() === '/login') {
      next('/')
    } else {
// 当有token的同时是否获取到了id如果有就放行
      if (Store.state.user.userinfo.userId) {
        next()
      } else {
//否则没有id则再次发起请求重新获取数据
        await Store.dispatch('user/sysuserinfo')
        next()
      }
    }
  // 当没有token的时候默认等于没有登录.那么通过白名单访问登录页面.或者404
  } else {
    // tolowerCase解决输入接口的大小写问题
    // if (whiterr.includes(to.path.toLowerCase())) {
    //   next()
    // }
    // 使用路由原的时候.通过自定义方式
    // 在路由中设置meta:{noLogin=true 为白名单.} 默认是false 
    if (to.meta.noLogin) {
      next()
    } else {
    // 设置退出或者重新登录时回跳到原来页面.
      next('/login?abcdefg=' + to.fullPath)
    }
  }
  // 这是一个模拟加载页面的效果
  // 有nprogress.start 请求进度条
  // nprogress.done 完成进度条.
  NProgress.done()
})

// 后置导航守卫
router.afterEach(() => {
  NProgress.done()
})

### 使用 Axios 请求拦截器的详细说明 Axios 请求拦截器允许在请求发送到服务器之前对其进行处理。以下是对 Axios 请求拦截器的完整介绍,包括配置方法、常见使用场景以及代码示例。 #### 配置 Axios 请求拦截器 通过 `axios.interceptors.request.use` 方法可以注册一个请求拦截器。该方法接收两个回调函数作为参数: - 第一个回调函数用于处理请求成功时的操作,返回值将是最终的请求配置。 - 第二个回调函数用于处理请求错误时的操作,通常会返回一个 `Promise.reject(error)`。 以下是配置请求拦截器代码示例: ```javascript import axios from 'axios'; // 创建 Axios 实例 const httpInstance = axios.create({ baseURL: 'https://api.example.com', timeout: 5000, }); // 配置请求拦截器 httpInstance.interceptors.request.use( config => { // 在发送请求之前添加身份验证令牌 const token = localStorage.getItem('authToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, error => { return Promise.reject(error); } ); export default httpInstance; ``` 上述代码中,在发送请求之前检查本地存储中的身份验证令牌,并将其添加到请求头中[^1]。 #### 常见使用场景 1. **添加全局身份验证令牌**:如上例所示,可以在每个请求中自动添加用户的身份验证令牌。 2. **修改请求头信息**:例如设置特定的 Content-Type 或其他自定义头部字段。 3. **记录请求日志**:在开发或调试阶段,可以打印请求的详细信息以便跟踪问题。 4. **处理跨域请求的凭据(Credentials)**:确保请求包含必要的凭据信息。 #### 注意事项 - 请求拦截器会对所有通过 Axios 发送的请求生效,因此需要确保逻辑不会影响其他请求。 - 如果有多个拦截器,它们将按照注册顺序依次执行。 - 拦截器可以被移除,使用 `httpInstance.interceptors.request.eject(id)` 方法,其中 `id` 是拦截器的唯一标识符[^4]。 --- #### 完整示例:结合请求和响应拦截器 以下是一个完整的示例,展示了如何同时配置请求拦截器和响应拦截器: ```javascript import axios from 'axios'; import { ElMessage } from 'element-plus'; // 创建 Axios 实例 const request = axios.create({ baseURL: 'https://api.example.com', timeout: 5000, }); // 请求拦截器 request.interceptors.request.use( config => { const token = sessionStorage.getItem('token'); if (token && config.url !== '/sys/login') { config.headers.token = token; } return config; }, error => { return Promise.reject(error); } ); // 响应拦截器 request.interceptors.response.use( res => { const code = res.data.code; if (code === 200) { return res.data.data; } else { return res.data; } }, error => { if (error.response.status === 401) { ElMessage.error('请先登录'); } else { ElMessage.error('请求失败,请重试'); } return Promise.reject(error); } ); export default request; ``` 此示例中,请求拦截器负责在非登录接口中添加身份验证令牌,而响应拦截器则处理不同状态码下的错误提示[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值