request.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import axios from 'axios'
  2. import store from '../store'
  3. import router from '../router'
  4. import { getToken, removeToken } from '@/utils/auth'
  5. import { anonUrls } from '../config'
  6. import {getRefreshToken, setRefreshToken, setToken} from "./auth";
  7. import {getAuthToken} from "../api/login";
  8. import Vue from 'vue'
  9. const Base64 = require('js-base64').Base64
  10. // 创建axios实例
  11. const service = axios.create({
  12. baseURL: '/api/', // api的base_url
  13. timeout: 15000, // 请求超时时间
  14. headers: {
  15. "Pragma": "no-cache",
  16. "Cache-Control": "must-revalidate",
  17. "Cache-Control": "no-cache" ,
  18. "Cache-Control": "no-store",
  19. }
  20. })
  21. const notSetAuthHeaderUrls = anonUrls;
  22. const base64Urls= [
  23. "./uc",
  24. "./op",
  25. "/umsUsers",
  26. "./personnel",
  27. "./meeting",
  28. "./cms",
  29. "./project"
  30. ]
  31. const needDownloadUrl=[
  32. // "/uum/sysAllAuditLogs/backups"
  33. ]
  34. // request拦截器
  35. let getTokenByRefreshToken = false;
  36. let retryRequests = [];
  37. service.interceptors.request.use(config => {
  38. let token = Vue.prototype.$Cookies.get('token');
  39. if (!config.headers.ANON && needSetAuthHead(config.url)) {
  40. // config.headers['Auth'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  41. // config.headers['Authorization'] = 'Bearer ' + getToken()
  42. config.headers['Authorization'] = 'Bearer ' + getToken()
  43. }else if(token !=undefined ){
  44. config.headers['Authorization'] = 'Bearer ' + getToken()
  45. }
  46. /* if(needBase64(config.url)){
  47. if(config.method=="post"||config.method=="put"){
  48. config.headers.post["Content-Type"] = "application/json;charset=UTF-8";
  49. config.headers.put["Content-Type"]="application/json;charset=UTF-8";
  50. config.data=Base64.encode(JSON.stringify(config.data));
  51. }
  52. }*/
  53. return config
  54. }, error => {
  55. // Do something with request error
  56. console.log(error) // for debug
  57. Promise.reject(error)
  58. })
  59. // respone拦截器
  60. service.interceptors.response.use(
  61. response => {
  62. //解密
  63. /* if(needBase64(response.config.url)){
  64. if(!needDownload(response.config.url)){
  65. response.data=JSON.parse(Base64.decode(response.data));
  66. }
  67. }else if(response.config.url.indexOf("/login") !=-1){
  68. response.data=JSON.parse(Base64.decode(response.data));
  69. }else{
  70. //
  71. }*/
  72. /**
  73. * code为非20000是抛错 可结合自己业务进行修改
  74. */
  75. // if (response['headers']['content-disposition']) {
  76. // const data = response.data;
  77. // var fileName = response['headers']['content-disposition'].split(";")[1].split("filename=")[1];
  78. // var index = fileName.lastIndexOf("\"");
  79. // if (index == fileName.length - 1) {
  80. // var start = 0;
  81. // if (fileName.indexOf("\"") == 0) {
  82. // start = 1;
  83. // }
  84. // fileName = fileName.substring(start, index);
  85. // }
  86. // return {
  87. // data,
  88. // fileName
  89. // }
  90. // }
  91. if (response['headers']['captcha-uid']) {
  92. return response;
  93. }
  94. const res = response.data;
  95. if (res['access_token'] || !res.status) {
  96. return response.data;
  97. }
  98. if (res.status != 200) {
  99. if (res.status == 401) {
  100. removeToken();
  101. // router.push({
  102. // path: '/login',
  103. // })
  104. } else {
  105. msg(res.msg);
  106. }
  107. return Promise.reject(res)
  108. } else {
  109. return response.data
  110. }
  111. },
  112. error => {
  113. const config = error.config;
  114. if (config.url == '/api/./uua/oauth/token') {
  115. removeToken();
  116. closeLoading();
  117. router.push({
  118. path: '/login',
  119. })
  120. return ;baseProjectEntityList
  121. }
  122. if (error && error.response) {
  123. if (error.response.status == 401) {
  124. Vue.prototype.$Cookies.remove('token');
  125. Vue.prototype.$Cookies.remove('userInfo');
  126. if (!getTokenByRefreshToken) {
  127. let p = new Promise((resolve) => {
  128. retryRequests.push((token) => {
  129. config.baseURL = '';
  130. config.headers['Authorization'] = 'Bearer ' + token;
  131. resolve(service(config));
  132. })
  133. });
  134. getTokenByRefreshToken = true;
  135. getAuthToken(getRefreshToken()).then(res => {
  136. if (res.hasOwnProperty('access_token') && res.access_token) {
  137. setToken(res['access_token']);
  138. setRefreshToken(res['refresh_token']);
  139. retryRequests.forEach(cb => cb(getToken()));
  140. retryRequests = [];
  141. }
  142. }).catch(error => {
  143. removeToken();
  144. closeLoading();
  145. router.push({
  146. path: '/login',
  147. })
  148. }).finally(() => {
  149. getTokenByRefreshToken = false;
  150. });
  151. return p;
  152. } else {
  153. return new Promise((resolve) => {
  154. retryRequests.push((token) => {
  155. config.baseURL = '';
  156. config.headers['Authorization'] = 'Bearer ' + token;
  157. resolve(service(config));
  158. })
  159. });
  160. }
  161. } else if (error.response.status == 403) {
  162. msg("无权访问");
  163. } else if (error.response.status == 500) {
  164. msg("系统繁忙,请稍后再试");
  165. }
  166. }
  167. console.log('err' + error) // for debug
  168. // store.dispatch('user/LOGOUT').then(() => {
  169. // //location.reload()// 为了重新实例化vue-router对象 避免bug
  170. // })
  171. // Message({
  172. // message: error.message,
  173. // type: 'error',
  174. // duration: 5 * 1000
  175. // })
  176. return Promise.reject(error)
  177. }
  178. )
  179. const needSetAuthHead = (url) => {
  180. return notSetAuthHeaderUrls.indexOf(url) == -1;
  181. }
  182. const msg = (msg) => {
  183. }
  184. const needBase64 = (reqUrl) => {
  185. var needBaseFlag=false;
  186. base64Urls.forEach(url =>{
  187. if(reqUrl.indexOf(url)!=-1){
  188. needBaseFlag=true;
  189. }
  190. })
  191. return needBaseFlag;
  192. }
  193. const needDownload = (repUrl) =>{
  194. var needUploadFlag=false;
  195. needDownloadUrl.forEach(url =>{
  196. if(repUrl.indexOf(url)!=-1){
  197. needUploadFlag=true;
  198. }
  199. })
  200. return needUploadFlag;
  201. }
  202. /* eslint-disable no-proto */
  203. service.__proto__ = axios
  204. /* eslint-enable */
  205. export default service