|
|
|
|
@ -53,69 +53,8 @@ $(document).ajaxError( function( event, jqxhr, settings, exception ){
|
|
|
|
|
if( jqxhr.responseJSON ){
|
|
|
|
|
// 세션 만료인 경우 처리
|
|
|
|
|
if(jqxhr.responseJSON.errorCode === "SESSION_EXPIRED") {
|
|
|
|
|
// 팝업창인지 확인
|
|
|
|
|
if (window.opener && !window.opener.closed) {
|
|
|
|
|
// 팝업창인 경우 세션 만료 메시지 표시
|
|
|
|
|
alert("세션이 종료되었습니다. 로그인 페이지로 이동합니다.");
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 중요로직: 최상위 부모창 찾기 (다중 팝업 처리)
|
|
|
|
|
var topWindow = window;
|
|
|
|
|
while (topWindow.opener && !topWindow.opener.closed) {
|
|
|
|
|
topWindow = topWindow.opener;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 최상위 부모창을 로그인 페이지로 이동
|
|
|
|
|
if (topWindow && !topWindow.closed) {
|
|
|
|
|
topWindow.location.href = loginUrl;
|
|
|
|
|
} else {
|
|
|
|
|
// 부모창이 닫혀있는 경우 현재 창에서 이동
|
|
|
|
|
location.href = loginUrl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 중요로직: 메인창 외에 모든 팝업창 종료 - 현재창부터 최상위까지 순차적으로 닫기
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
try {
|
|
|
|
|
var currentWindow = window;
|
|
|
|
|
var windowsToClose = [];
|
|
|
|
|
|
|
|
|
|
// 현재 창부터 최상위 부모창까지의 모든 팝업창 수집
|
|
|
|
|
while (currentWindow && currentWindow.opener && !currentWindow.opener.closed) {
|
|
|
|
|
windowsToClose.push(currentWindow);
|
|
|
|
|
currentWindow = currentWindow.opener;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 수집된 모든 팝업창을 역순으로 닫기 (하위창부터 상위창 순서)
|
|
|
|
|
for (var i = 0; i < windowsToClose.length; i++) {
|
|
|
|
|
try {
|
|
|
|
|
console.log('[세션만료] 팝업창 닫기 시도:', i + 1, '/', windowsToClose.length);
|
|
|
|
|
windowsToClose[i].close();
|
|
|
|
|
} catch (closeError) {
|
|
|
|
|
console.warn('[세션만료] 팝업창 닫기 실패:', closeError);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log('[세션만료] 총', windowsToClose.length, '개의 팝업창 닫기 완료');
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.warn('[세션만료] 팝업창 일괄 닫기 실패:', e);
|
|
|
|
|
// 기본 방식으로 현재 창 닫기
|
|
|
|
|
try {
|
|
|
|
|
window.close();
|
|
|
|
|
} catch (fallbackError) {
|
|
|
|
|
console.warn('[세션만료] 기본 방식 팝업창 닫기도 실패:', fallbackError);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, 100);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error("팝업 세션 만료 처리 중 오류:", e);
|
|
|
|
|
// 오류 발생 시 현재 창에서 로그인 페이지로 이동
|
|
|
|
|
location.href = loginUrl;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 일반 페이지인 경우 메시지 표시 후 로그인 페이지로 이동
|
|
|
|
|
alert(jqxhr.responseJSON.message);
|
|
|
|
|
location.href = loginUrl;
|
|
|
|
|
}
|
|
|
|
|
// 새로운 공통 함수를 사용하여 세션 만료 처리
|
|
|
|
|
handleSessionExpired();
|
|
|
|
|
} else if(jqxhr.responseJSON.errorCode === "MessageException") {
|
|
|
|
|
alert(jqxhr.responseJSON.message);
|
|
|
|
|
} else if(jqxhr.responseJSON.errorCode === "MESSAGE") {
|
|
|
|
|
@ -397,6 +336,124 @@ function makeColorTransparent(color, opacity) {
|
|
|
|
|
return color;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 모든 팝업을 닫고 메인페이지를 로그인 페이지로 이동시키는 함수
|
|
|
|
|
* 중요로직: 다중 팝업 구조에서 안전하게 모든 팝업을 닫고 최상위 창만 로그인 페이지로 이동
|
|
|
|
|
* @param {string} message - 사용자에게 표시할 메시지 (선택사항)
|
|
|
|
|
* @param {boolean} showAlert - alert 창 표시 여부 (기본값: true)
|
|
|
|
|
*/
|
|
|
|
|
function redirectToLoginWithCloseAllPopups(message, showAlert) {
|
|
|
|
|
try {
|
|
|
|
|
// 기본값 설정
|
|
|
|
|
if (showAlert === undefined) showAlert = true;
|
|
|
|
|
if (!message) message = "로그인 페이지로 이동합니다.";
|
|
|
|
|
|
|
|
|
|
// 메시지 표시
|
|
|
|
|
if (showAlert) {
|
|
|
|
|
alert(message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 중요로직: 최상위 부모창 찾기 (다중 팝업 처리)
|
|
|
|
|
var topWindow = window;
|
|
|
|
|
var currentWindow = window;
|
|
|
|
|
|
|
|
|
|
// 현재 창부터 최상위까지의 모든 창 정보 수집
|
|
|
|
|
var windowChain = [];
|
|
|
|
|
while (currentWindow) {
|
|
|
|
|
windowChain.push({
|
|
|
|
|
window: currentWindow,
|
|
|
|
|
isPopup: !!(currentWindow.opener && !currentWindow.opener.closed)
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (currentWindow.opener && !currentWindow.opener.closed) {
|
|
|
|
|
currentWindow = currentWindow.opener;
|
|
|
|
|
topWindow = currentWindow;
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log('[로그인 리다이렉트] 창 체인 정보:', windowChain.length + '개의 창 감지');
|
|
|
|
|
|
|
|
|
|
// 최상위 부모창을 로그인 페이지로 이동
|
|
|
|
|
if (topWindow && !topWindow.closed) {
|
|
|
|
|
try {
|
|
|
|
|
topWindow.location.href = (contextPath || '') + loginUrl;
|
|
|
|
|
console.log('[로그인 리다이렉트] 최상위 창 리다이렉트 성공');
|
|
|
|
|
} catch (redirectError) {
|
|
|
|
|
console.warn('[로그인 리다이렉트] 최상위 창 리다이렉트 실패:', redirectError);
|
|
|
|
|
// 리다이렉트 실패 시 현재 창에서 이동
|
|
|
|
|
location.href = (contextPath || '') + loginUrl;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 최상위 창이 닫혀있는 경우 현재 창에서 이동
|
|
|
|
|
location.href = (contextPath || '') + loginUrl;
|
|
|
|
|
console.log('[로그인 리다이렉트] 현재 창에서 리다이렉트');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 중요로직: 메인창 외에 모든 팝업창 종료
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
try {
|
|
|
|
|
var popupsToClose = windowChain.filter(function(item) {
|
|
|
|
|
return item.isPopup;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
console.log('[로그인 리다이렉트] 닫을 팝업 수:', popupsToClose.length);
|
|
|
|
|
|
|
|
|
|
// 수집된 모든 팝업창을 닫기 (하위창부터 상위창 순서)
|
|
|
|
|
for (var i = 0; i < popupsToClose.length; i++) {
|
|
|
|
|
try {
|
|
|
|
|
var popupWindow = popupsToClose[i].window;
|
|
|
|
|
if (popupWindow && !popupWindow.closed) {
|
|
|
|
|
popupWindow.close();
|
|
|
|
|
console.log('[로그인 리다이렉트] 팝업창 닫기 성공:', i + 1);
|
|
|
|
|
}
|
|
|
|
|
} catch (closeError) {
|
|
|
|
|
console.warn('[로그인 리다이렉트] 팝업창 닫기 실패:', closeError);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log('[로그인 리다이렉트] 모든 팝업창 닫기 완료');
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.warn('[로그인 리다이렉트] 팝업창 일괄 닫기 실패:', e);
|
|
|
|
|
// 기본 방식으로 현재 창 닫기 시도
|
|
|
|
|
if (window.opener && !window.opener.closed) {
|
|
|
|
|
try {
|
|
|
|
|
window.close();
|
|
|
|
|
} catch (fallbackError) {
|
|
|
|
|
console.warn('[로그인 리다이렉트] 기본 방식 팝업창 닫기도 실패:', fallbackError);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, 200); // 리다이렉트 후 약간의 지연을 두어 안정성 확보
|
|
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error("[로그인 리다이렉트] 전체 처리 중 오류:", e);
|
|
|
|
|
// 모든 처리가 실패한 경우 현재 창에서 로그인 페이지로 이동
|
|
|
|
|
try {
|
|
|
|
|
location.href = (contextPath || '') + loginUrl;
|
|
|
|
|
} catch (finalError) {
|
|
|
|
|
console.error("[로그인 리다이렉트] 최종 리다이렉트도 실패:", finalError);
|
|
|
|
|
// 최후의 수단으로 새로고침
|
|
|
|
|
location.reload();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 로그아웃 함수 - 모든 팝업을 닫고 로그인 페이지로 이동
|
|
|
|
|
*/
|
|
|
|
|
function logout() {
|
|
|
|
|
redirectToLoginWithCloseAllPopups("로그아웃 되었습니다.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 세션 만료 처리 함수 - 모든 팝업을 닫고 로그인 페이지로 이동
|
|
|
|
|
*/
|
|
|
|
|
function handleSessionExpired() {
|
|
|
|
|
redirectToLoginWithCloseAllPopups("세션이 종료되었습니다. 다시 로그인해주세요.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 페이지 로드 시 모든 selectbox에 자동 색상 적용
|
|
|
|
|
*/
|
|
|
|
|
|