request.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import axios from 'axios'
  2. import {
  3. getToken,
  4. removeToken,
  5. getRefreshToken,
  6. setRefreshToken,
  7. setToken
  8. } from '@/utils/auth'
  9. import {
  10. anonUrls
  11. } from '@/utils/config'
  12. import {
  13. getAuthToken
  14. } from "../api/login";
  15. // 创建axios实例
  16. const service = axios.create({
  17. baseURL: '/api/', // api的base_url
  18. timeout: 15000, // 请求超时时间
  19. headers: {
  20. "Pragma": "no-cache",
  21. "Cache-Control": "must-revalidate",
  22. "Cache-Control": "no-cache",
  23. "Cache-Control": "no-store",
  24. }
  25. })
  26. const notSetAuthHeaderUrls = anonUrls;
  27. // request拦截器
  28. let getTokenByRefreshToken = false;
  29. let retryRequests = [];
  30. service.interceptors.request.use(config => {
  31. console.log('12321312312-----', config);
  32. // debugger
  33. if (!config.headers.ANON && needSetAuthHead(config.url)) {
  34. // config.headers['Auth'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  35. // config.headers['Authorization'] = 'Bearer ' + getToken()
  36. config.headers['Authorization'] = 'Bearer ' + getToken()
  37. }
  38. return config
  39. }, error => {
  40. // Do something with request error
  41. console.log(error) // for debug
  42. Promise.reject(error)
  43. })
  44. // respone拦截器
  45. service.interceptors.response.use(
  46. response => {
  47. /**
  48. * code为非20000是抛错 可结合自己业务进行修改
  49. */
  50. if (response['headers']['content-disposition']) {
  51. const data = response.data;
  52. var fileName = response['headers']['content-disposition'].split(";")[1].split("filename=")[1];
  53. var index = fileName.lastIndexOf("\"");
  54. if (index == fileName.length - 1) {
  55. var start = 0;
  56. if (fileName.indexOf("\"") == 0) {
  57. start = 1;
  58. }
  59. fileName = fileName.substring(start, index);
  60. }
  61. return {
  62. data,
  63. fileName
  64. }
  65. }
  66. if (response['headers']['captcha-uid']) {
  67. return response;
  68. }
  69. const res = response.data;
  70. if (res['access_token'] || !res.status) {
  71. return response.data;
  72. }
  73. if (res.status != 200) {
  74. if (res.status == 401) {
  75. removeToken();
  76. // router.push({
  77. // path: '/login',
  78. // })
  79. } else {
  80. msg(res.msg);
  81. }
  82. return Promise.reject(res)
  83. } else {
  84. return response.data
  85. }
  86. },
  87. error => {
  88. const config = error.config;
  89. if (config.url == '/api/./uua/oauth/token') {
  90. removeToken();
  91. closeLoading();
  92. router.push({
  93. path: '/login',
  94. })
  95. return;
  96. }
  97. if (error && error.response) {
  98. if (error.response.status == 401) {
  99. if (!getTokenByRefreshToken) {
  100. let p = new Promise((resolve) => {
  101. retryRequests.push((token) => {
  102. config.baseURL = '';
  103. config.headers['Authorization'] = 'Bearer ' + token;
  104. resolve(service(config));
  105. })
  106. });
  107. getTokenByRefreshToken = true;
  108. getAuthToken(getRefreshToken()).then(res => {
  109. if (res.hasOwnProperty('access_token') && res.access_token) {
  110. setToken(res['access_token']);
  111. setRefreshToken(res['refresh_token']);
  112. retryRequests.forEach(cb => cb(getToken()));
  113. retryRequests = [];
  114. }
  115. }).catch(error => {
  116. removeToken();
  117. closeLoading();
  118. router.push({
  119. path: '/login',
  120. })
  121. }).finally(() => {
  122. getTokenByRefreshToken = false;
  123. });
  124. return p;
  125. } else {
  126. return new Promise((resolve) => {
  127. retryRequests.push((token) => {
  128. config.baseURL = '';
  129. config.headers['Authorization'] = 'Bearer ' + token;
  130. resolve(service(config));
  131. })
  132. });
  133. }
  134. } else if (error.response.status == 403) {
  135. msg("无权访问");
  136. } else if (error.response.status == 500) {
  137. msg("系统繁忙,请稍后再试");
  138. }
  139. }
  140. // store.dispatch('user/LOGOUT').then(() => {
  141. // //location.reload()// 为了重新实例化vue-router对象 避免bug
  142. // })
  143. // Message({
  144. // message: error.message,
  145. // type: 'error',
  146. // duration: 5 * 1000
  147. // })
  148. return Promise.reject(error)
  149. }
  150. )
  151. const needSetAuthHead = (url) => {
  152. return notSetAuthHeaderUrls.indexOf(url) == -1;
  153. }
  154. const msg = (msg) => {}
  155. /* eslint-disable no-proto */
  156. service.__proto__ = axios
  157. /* eslint-enable */
  158. export default service