当前位置:   article > 正文

Vue 拦截器原理和详细使用_service.interceptors.request.use

service.interceptors.request.use

拦截器原理和作用

  • 首先拦截器在src/utils/request.js 文件中,拦截器分为请求拦截器和响应拦截器。

  • 页面中的每一个请求都会经过请求拦截和响应拦截,所以一般在这个文件进行操作。

  • 这一文件一般引入axios,vuex,Message,router 和相关方法 ,基地址+拦截器。

  • 请求拦截器:Token的主动处理 给每一个请求添加请求头token 对请求异常抛出。

  • 响应拦截器:简化axios默认加了一层的data Token被动处理 对请求异常抛出。


最简化版本

  1. // 导入axios
  2. import axios from 'axios'
  3. // 基地址
  4. const service = axios.create({
  5. baseURL: process.env.VUE_APP_BASE_API,
  6. // 5秒超时
  7. timeout: 10000
  8. })
  9. // 请求拦截
  10. request.interceptors.request.use(
  11. config => {
  12. return config
  13. },
  14. error => {
  15. return Promise.reject(error)
  16. }
  17. )
  18. // 响应拦截
  19. request.interceptors.response.use(
  20. res => {
  21. return res
  22. },
  23. // 响应错误的代码写这里
  24. error => {
  25. return Promise.reject(error)
  26. }
  27. )
  28. // 暴露副本
  29. export default service

下面是实际开发中使用

注意:

当我们使用axios时候,他会给我们默认加一层data。这样我们取数据的时候就会比较增加无效代码,所以我们可以在数据响应的时候判断,给他人为的去掉一层,如下面判断 return data ,这样就可以直接res.data.变量

还有一个是token 处理 这里包含了主动处理:登录时候存一个时间,判断这个时间,超过就调用登出方法,提示信息,打回到登录页。被动处理:异常的时候判断一下,如果是和后端规定好的token过期状态码(比如401),就调用登出方法,提示信息,打回到登录页。

基地址最好不要写死写变量名,这样我们就可以通过改环境文件快速更改地址。

  1. // 导入axios
  2. import axios from 'axios'
  3. // 导入提示信息
  4. import { Message } from 'element-ui'
  5. // 导入vuex
  6. import store from '@/store'
  7. // 导入路由
  8. import router from '@/router'
  9. // 导入获取时间和token的工具函数
  10. import { getToken, getTokenTime } from '@/utils/auth'
  11. // 基地址
  12. const service = axios.create({
  13. baseURL: process.env.VUE_APP_BASE_API,
  14. // 5秒超时
  15. timeout: 10000
  16. })
  17. // 请求拦截
  18. // 添加一个service的请求拦截器
  19. service.interceptors.request.use(
  20. async config => {
  21. // config就是本次发请求的信息
  22. // 判断有没有token
  23. if (store.state.user.token) {
  24. // token失效的主动处理
  25. // 获取一下记录token的时间
  26. let start = getTokenTime()
  27. // 获取一下当前时间
  28. let now = Date.now()
  29. // 算出时间差
  30. let hour = (now - start) / 1000 / 3600
  31. // 判断是否超过1小时
  32. if (hour >= 1) {
  33. // 代表token过期
  34. await store.dispatch('user/logout')
  35. Message.error('token已过期,请重新登录')
  36. router.push('/login')
  37. // return代表不往下执行,所以这个请求不会发送
  38. return
  39. }
  40. config.headers.Authorization = 'Bearer ' + getToken()
  41. config.headers['Bearer'] = getToken()
  42. // config.headers.tenantid = getTenantId ()
  43. }
  44. // 发送请求
  45. return config
  46. },
  47. error => {
  48. return Promise.reject(error)
  49. }
  50. )
  51. // 响应拦截
  52. service.interceptors.response.use(
  53. res => {
  54. // axios默认加了一层data
  55. // 这个res包括这个请求响应回来的所有信息
  56. // 所有的接口请求都会回到这里
  57. // 获取到本次请求得到的数据
  58. const data = res.data
  59. // 会帮所有的请求打印
  60. // console.log(data);
  61. // 判断本次请求是否成功
  62. if (data.code === 200 || data.code == 0) {
  63. // 如果响应成功,则正常给他返回数据
  64. return data
  65. } else {
  66. // 证明失败,我们需要让外面的catch被调用
  67. // 要让catch被调用,就要手动抛出一个错误,并把服务器返回的消息抛回去
  68. Message.warning(data.message || data.msg)
  69. return Promise.reject(data.message)
  70. }
  71. },
  72. async error => {
  73. // token失效的被动处理
  74. console.log(error)
  75. if (error.response.data.code === 401) {
  76. await store.dispatch('user/logout')
  77. Message.warning('登录状态过期,请重新登录!')
  78. router.push('/login')
  79. } else {
  80. return Promise.reject(error)
  81. }
  82. }
  83. // error => {
  84. // return Promise.reject(error)
  85. // }
  86. )
  87. // 暴露副本
  88. export default service

浏览器存取

img


总结:

经过这一趟流程下来相信你也对 Vue 拦截器原理和详细使用 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人!

什么不足的地方请大家指出谢谢 -- 風过无痕

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/257421
推荐阅读
相关标签
  

闽ICP备14008679号