1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import { Store } from 'vuex';
import axios from 'axios';
import Router from 'vue-router';
import i18n from '@/locale';
/**
* 拦截器
*
* @export
* @class Interceptors
*/
export class Interceptors {
/**
* 路由对象
*
* @private
* @type {(Router | any)}
* @memberof Interceptors
*/
private router: Router | any;
/**
* 缓存对象
*
* @private
* @type {(Store<any> | any)}
* @memberof Interceptors
*/
private store: Store<any> | any;
/**
* 单列对象
*
* @private
* @static
* @type {LoadAppData}
* @memberof Interceptors
*/
private static readonly instance: Interceptors = new Interceptors();
/**
* Creates an instance of Interceptors.
* 私有构造,拒绝通过 new 创建对象
*
* @memberof Interceptors
*/
private constructor() {
if (Interceptors.instance) {
return Interceptors.instance;
} else {
this.intercept();
}
}
/**
* 获取 LoadAppData 单例对象
*
* @static
* @param {Router} route
* @param {Store<any>} store
* @returns {Interceptors}
* @memberof Interceptors
*/
public static getInstance(route: Router, store: Store<any>): Interceptors {
this.instance.router = route;
this.instance.store = store;
return this.instance;
}
/**
* 拦截器实现接口
*
* @private
* @memberof Interceptors
*/
private intercept(): void {
axios.interceptors.request.use((config: any) => {
let appdata: any ;
if (this.router) {
appdata = this.store.getters.getAppData();
}
if (appdata && appdata.context) {
config.headers['srforgsectorid'] = appdata.context.srforgsectorid;
}
if (window.localStorage.getItem('token')) {
const token = window.localStorage.getItem('token');
config.headers['Authorization'] = `Bearer ${token}`;
}
config.headers['Accept-Language'] = i18n.locale;
// if (!config.url.startsWith('https://') && !config.url.startsWith('http://')) {
// config.url = Environment.BaseUrl + config.url;
// }
return config;
}, (error: any) => {
return Promise.reject(error);
});
axios.interceptors.response.use((response: any) => {
return response;
}, (error: any) => {
error = error ? error : { response: {} };
let { response: res } = error;
let { data: _data } = res;
if (res.status === 401) {
this.doNoLogin(_data.data);
}
// if (res.status === 404) {
// this.router.push({ path: '/404' });
// } else if (res.status === 500) {
// this.router.push({ path: '/500' });
// }
return Promise.reject(res);
});
}
/**
* 处理未登录异常情况
*
* @private
* @param {*} [data={}]
* @memberof Interceptors
*/
private doNoLogin(data: any = {}): void {
if (data.loginurl && !Object.is(data.loginurl, '') && data.originurl && !Object.is(data.originurl, '')) {
let _url = encodeURIComponent(encodeURIComponent(window.location.href));
let loginurl: string = data.loginurl;
const originurl: string = data.originurl;
if (originurl.indexOf('?') === -1) {
_url = `${encodeURIComponent('?RU=')}${_url}`;
} else {
_url = `${encodeURIComponent('&RU=')}${_url}`;
}
loginurl = `${loginurl}${_url}`;
window.location.href = loginurl;
} else {
if (Object.is(this.router.currentRoute.name, 'login')) {
return;
}
this.router.push({ name: 'login', query: { redirect: this.router.currentRoute.fullPath } });
}
}
}