|
|
|
|
@ -59,7 +59,7 @@ $(document).ajaxError( function( event, jqxhr, settings, exception ){
|
|
|
|
|
alert("세션이 종료되었습니다. 로그인 페이지로 이동합니다.");
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 최상위 부모창 찾기 (다중 팝업 처리)
|
|
|
|
|
// 중요로직: 최상위 부모창 찾기 (다중 팝업 처리)
|
|
|
|
|
var topWindow = window;
|
|
|
|
|
while (topWindow.opener && !topWindow.opener.closed) {
|
|
|
|
|
topWindow = topWindow.opener;
|
|
|
|
|
@ -73,12 +73,37 @@ $(document).ajaxError( function( event, jqxhr, settings, exception ){
|
|
|
|
|
location.href = loginUrl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 현재 팝업창 닫기 (안전한 처리)
|
|
|
|
|
// 중요로직: 메인창 외에 모든 팝업창 종료 - 현재창부터 최상위까지 순차적으로 닫기
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
try {
|
|
|
|
|
window.close();
|
|
|
|
|
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);
|
|
|
|
|
console.warn('[세션만료] 팝업창 일괄 닫기 실패:', e);
|
|
|
|
|
// 기본 방식으로 현재 창 닫기
|
|
|
|
|
try {
|
|
|
|
|
window.close();
|
|
|
|
|
} catch (fallbackError) {
|
|
|
|
|
console.warn('[세션만료] 기본 방식 팝업창 닫기도 실패:', fallbackError);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, 100);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|