
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
import axios from 'axios';
import store from "../../views/pages/AppStore";
const apiClient = axios.create({
baseURL: '/',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
}
});
const excludeCtxUrls = [
'/sys/cntxtPth/findLatestCntxtPth.json' // Context Path 정보 호출
]
apiClient.interceptors.request.use(
config => {
const excludeCtxUrl = excludeCtxUrls.some(url => config.url.includes(url));
const contextPath = store.state.contextPath || '';
if(!excludeCtxUrl) {
config.url = contextPath + config.url; // 요청 시 Context Path 추가
}
config.headers.Authorization = store.state.authorization; // 요청 시 AccessToken 추가
return config;
},
error => {
return Promise.reject(error);
}
)
apiClient.interceptors.response.use(
response => {
return response;
},
async error => {
if (!error.response) {
return Promise.reject(error);
}
if (error.response.status == 403 && error.response.data.message == '접근 권한이 없습니다.') {
window.history.back();
}
const originalReq = error.config;
if (originalReq.url.includes('/refresh/tokenReissue.json')) {
return Promise.reject(error);
}
// 토큰의 만료기간이 끝난경우
// if (error.response.status == 401 && error.response.data.message == 'Token expired' && !originalReq._retry) {
if (error.response.status === 401 && error.response.data?.message?.toLowerCase().includes('expired') && !originalReq._retry) {
originalReq._retry = true; // 재요청 시도(한번만 실행)
try {
const res = await axios.post('/refresh/tokenReissue.json', {});
store.commit('setAuthorization', res.headers.authorization); // 새로 발급 받은 AccessToken 저장
originalReq.headers.Authorization = store.state.authorization; // 새로 발급 받은 AccessToken을 기존 요청에 추가
/** jwt토큰 디코딩 **/
const base64String = store.state.authorization.split('.')[1];
const base64 = base64String.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(atob(base64).split('').map(c => {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
const mbr = JSON.parse(jsonPayload);
// const mbr = JSON.parse(decodeURIComponent(escape(window.atob(base64String)))); // jwt claim 추출
store.commit("setMbrNm", mbr.mbrNm);
store.commit('setRoles', mbr.roles);
/** jwt토큰 디코딩 **/
return apiClient(originalReq); // 원래 요청 재시도 /pathname + search
} catch (refreshError) {
const redirect = window.location.pathname + window.location.search;
sessionStorage.setItem("redirect", redirect);
alert('세션이 종료 되었습니다.\n로그인을 새로 해주세요.');
store.commit("setStoreReset");
//refresh 쿠키 삭제
document.cookie = "refresh=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
window.location = '/login.page';
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
)
export default apiClient;