Files
eapim-admin/WebContent/jsp/common/screen/emergency.jsp
T
2026-06-16 13:19:10 +09:00

431 lines
15 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@page import="com.eactive.eai.rms.common.datasource.DataSourceType"%>
<%@page import="com.eactive.eai.rms.common.datasource.DataSourceTypeManager"%>
<%@page import="com.eactive.eai.common.util.SystemUtil"%>
<%@page import="com.eactive.eai.rms.env.EmsConfig"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ include file="/jsp/common/include/localemessage.jsp" %>
<c:set var="themeColor" value="<%=System.getProperty(\"theme.color\")%>" scope="session" />
<%
String sysMode = (String)System.getProperty("eai.systemmode");
String sysModeName = "";
/* System.out.println("##### SERVER_TYPE ====>"+sysMode); */
if( sysMode == null ) {
sysMode = "";
}
if (sysMode.equals("T")) {
sysModeName = "테스트";
} else if (sysMode.equals("D")){
sysModeName = "개발";
}else {
sysModeName = "";
}
String systemModeTitle = SystemUtil.getSystemModeTitle();
String drmode = System.getProperty(EmsConfig.DR_MODE);
if ("Y".equals(drmode)) {
systemModeTitle = "[DR] ";
}
%>
<%
String resultMsg = (String)session.getAttribute("resultMsg");
session.removeAttribute("resultMsg");
session.removeAttribute("SSO_ID");
request.removeAttribute("SSO_ID");
if( resultMsg == null ) {
resultMsg = "";
}
%>
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-control" CONTENT="no-cache">
<link rel="icon"
href="<c:url value="/img/ic_eai_favi_${themeColor}.png"/>"
type="image/ico" sizes="16x16" />
<title><%=systemModeTitle%><%=localeMessage.getString("screen.title")%></title>
<link rel="stylesheet" href="<c:url value="/css/login-style.css"/>">
<link rel="stylesheet" href="<c:url value="/css/login-fontawesome_all.css"/>">
<link rel="stylesheet" href="<c:url value="/addon/bootstrap-4.6.2/css/bootstrap.min.css"/>">
<script src="<c:url value="/js/jquery-1.12.1.min.js"/>"></script>
<script src="<c:url value="/addon/bootstrap-4.6.2/js/bootstrap.bundle.min.js"/>"></script>
<script type="text/javascript">
if( self.name == 'mainFrame' || self.name == 'leftFrame' || self.name == 'topFrame') {
parent.window.location.href='<c:url value="/"/>';
}
// SMS 인증 관련 변수
var smsAuthTimer = null;
var resendTimer = null;
function fncPreMain() {
if ($("input[name=userId]").val() ==null || $("input[name=userId]").val().length == 0 ){
alert("<%= localeMessage.getString("login.checkid") %>");
$("input[name=userId]").trigger("focus");
return;
}
if ($("input[name=password]").val() ==null || $("input[name=password]").val().length == 0 ){
alert("<%= localeMessage.getString("login.checkpwd1") %>");
$("input[name=password]").trigger("focus");
return;
}
if ($("select[name=serviceType]").val() ==null|| $("select[name=serviceType]").val().length == 0 ){
alert("<%= localeMessage.getString("login.checkservicetype") %>");
$("select[name=serviceType]").trigger("focus");
return;
}
sessionStorage["serviceType"]= $("select[name=serviceType]").val();
// AJAX 로그인 요청
$.ajax({
url: '<c:url value="/login-ajax.do"/>',
type: 'POST',
data: $('#loginForm').serialize(),
dataType: 'json',
success: function(response) {
if (response.smsAuthRequired) {
// SMS 인증 필요
showSmsAuthModal(response);
} else if (response.success) {
// 직접 로그인 성공
window.location.href = response.redirectUrl;
} else {
// 로그인 실패
alert(response.errorMessage || '로그인에 실패했습니다.');
}
},
error: function(xhr, status, error) {
console.error('Login error:', error);
alert('로그인 처리 중 오류가 발생했습니다.');
}
});
}
// SMS 인증 모달 표시
function showSmsAuthModal(data) {
$('#smsAuthMaskedPhone').text(data.maskedPhone);
$('#smsAuthCode').val('');
startExpiryTimer(data.expiresAt);
startResendTimer(data.resendableAt);
$('#smsAuthModal').modal('show');
}
// 유효시간 타이머
function startExpiryTimer(expiresAt) {
clearInterval(smsAuthTimer);
updateRemainingTime(expiresAt);
smsAuthTimer = setInterval(function() {
var remaining = Math.max(0, Math.floor((expiresAt - Date.now()) / 1000));
$('#smsAuthRemainingTime').text(remaining);
if (remaining <= 0) {
clearInterval(smsAuthTimer);
alert('인증 시간이 만료되었습니다. 다시 시도해주세요.');
$('#smsAuthModal').modal('hide');
}
}, 1000);
}
function updateRemainingTime(expiresAt) {
var remaining = Math.max(0, Math.floor((expiresAt - Date.now()) / 1000));
$('#smsAuthRemainingTime').text(remaining);
}
// 재발송 타이머
function startResendTimer(resendableAt) {
$('#btnSmsResend').prop('disabled', true);
clearInterval(resendTimer);
updateResendButtonText(resendableAt);
resendTimer = setInterval(function() {
var remaining = Math.max(0, Math.ceil((resendableAt - Date.now()) / 1000));
if (remaining <= 0) {
$('#btnSmsResend').prop('disabled', false).text('재발송');
clearInterval(resendTimer);
} else {
$('#btnSmsResend').text('재발송 (' + remaining + '초)');
}
}, 1000);
}
function updateResendButtonText(resendableAt) {
var remaining = Math.max(0, Math.ceil((resendableAt - Date.now()) / 1000));
if (remaining > 0) {
$('#btnSmsResend').text('재발송 (' + remaining + '초)');
} else {
$('#btnSmsResend').text('재발송');
}
}
// SMS 인증번호 재발송
function resendSmsAuthCode() {
$.ajax({
url: '<c:url value="/sms-auth/resend.json"/>',
type: 'POST',
dataType: 'json',
success: function(data) {
if (data.sent) {
startExpiryTimer(data.expiresAt);
startResendTimer(data.resendableAt);
alert('인증번호가 재발송되었습니다.');
} else {
alert(data.errorMessage || '재발송에 실패했습니다.');
}
},
error: function() {
alert('재발송 요청 중 오류가 발생했습니다.');
}
});
}
// SMS 인증번호 확인
function verifySmsAuthCode() {
var code = $('#smsAuthCode').val();
if (!code || code.length !== 6) {
alert('6자리 인증번호를 입력해주세요.');
$('#smsAuthCode').focus();
return;
}
$.ajax({
url: '<c:url value="/sms-auth/verify.json"/>',
type: 'POST',
data: { authCode: code },
dataType: 'json',
success: function(data) {
if (data.success) {
$('#smsAuthModal').modal('hide');
window.location.href = data.redirectUrl;
} else {
alert(data.errorMessage || '인증에 실패했습니다.');
}
},
error: function() {
alert('인증 요청 중 오류가 발생했습니다.');
}
});
}
// SMS 인증 취소
function cancelSmsAuth() {
clearInterval(smsAuthTimer);
clearInterval(resendTimer);
$('#smsAuthModal').modal('hide');
}
function changePwd(){
if ($("input[name=resetUserId]").val() == null || $("input[name=resetUserId]").val().length == 0 ){
alert("<%= localeMessage.getString("login.checkid") %>");
$("input[name=resetUserId]").trigger("focus");
return;
}
if ($("input[name=resetPassword]").val() == null || $("input[name=resetPassword]").val().trim().length == 0 ){
alert("<%= localeMessage.getString("login.checkpwd1") %>");
$("input[name=resetPassword]").trigger("focus");
return;
}
if ($("input[name=changePassword]").val() == null || $("input[name=changePassword]").val().trim().length == 0 ){
alert("<%= localeMessage.getString("login.checkpwd2") %>");
$("input[name=changePassword]").trigger("focus");
return ;
}
if ($("input[name=confirmPassword]").val() == null || $("input[name=confirmPassword]").val().trim().length == 0 ){
alert("<%= localeMessage.getString("login.checkpwd3") %>");
return ;
}
if ($("input[name=confirmPassword]").val() != $("input[name=confirmPassword]").val()){
alert("<%= localeMessage.getString("login.checkpwd4") %>");
$("input[name=confirmPassword]").trigger("focus");
return ;
}
if ($("input[name=resetUserId]").val() == $("input[name=changePassword]").val()){
alert("<%= localeMessage.getString("login.checkpwd5") %>");
$("input[name=changePassword]").trigger("focus");
return ;
}
//if (idCheck.checked){
// setCookie("key",id);
//}
<%-- $("form").attr("action","<c:url value="/changePassword.do"/>");
//$("form").action = "<%=request.getContextPath()%>/changePassword.do";
--%>
$("form").submit();
}
$(document).ready(function() {
$("input[name=userId]").keydown(function(event){
if ( event.which == 13 ) {
fncPreMain();
}
});
$("input[name=password]").keydown(function(event){
if ( event.which == 13 ) {
fncPreMain();
}
});
$("input[name=changePassword]").keydown(function(event){
if ( event.which == 13 ) {
changePwd();
}
});
$("input[name=confirmPassword]").keydown(function(event){
if ( event.which == 13 ) {
changePwd();
}
});
$("select[name=serviceType]").change(function(){
fncPreMain();
});
$("#btn_login").click(function(){
fncPreMain();
});
$("#changePwd").click(function(){
changePwd();
});
$("#btn_sso_login").click(function(){
fncSsoLogin();
});
// SMS 인증번호 입력 필드에서 엔터키 누르면 확인
$("#smsAuthCode").keydown(function(event){
if ( event.which == 13 ) {
verifySmsAuthCode();
}
});
});
function fncSsoLogin() {
sessionStorage["serviceType"] = $("select[name=serviceType]").val();
location.href = '<c:url value="/sso/login.do"/>';
}
</script>
</head>
<body>
<div class="container mt-5">
<div class="row justify-content-left mb-3">
<div class="col-md-12 text-center">
<img style="width: 20%;opacity: 0.4;" src='<c:url value="/img/logo_eactive.png"/>'/>
</div>
</div>
<div class="row justify-content-center">
<div class="col-md-8 text-center">
<h1 style="vertical-align: middle !important" class="h1"><span class="text-danger">e</span><span class="text-info">Link Monitoring Admin</span></h1>
</div>
</div>
<div class="row justify-content-center">
<div class="col-md-7 col-lg-5">
<div class="login-wrap p-4 p-md-5">
<div class="icon text-danger d-flex align-items-center justify-content-center">
<img style="width: 40px;" src='<c:url value="/img/login/user.png"/>'/>
</div>
<h3 class="text-center mb-4">Log In</h3>
<form name="form" id="loginForm" action="<c:url value="/login.do"/>" method="post">
<div class="form-group">
<input type="text" name="userId" class="form-control rounded-left" placeholder="Id" required>
</div>
<div class="form-group d-flex">
<input type="password" name="password" class="form-control rounded-left" placeholder="Password" autocomplete="off" required>
</div>
<div class="form-group">
<select name="serviceType" class="form-control rounded-left" placeholder="system" required>
<%
for (DataSourceType dt : DataSourceTypeManager.getDynamicDataSourceTypes()){
%>
<option value="<%=dt.getName()%>"><%=dt.getText()%></option>
<%
}
%>
</select>
</div>
<div class="form-group">
<input type="button" id ="btn_login" class="form-control btn btn-primary rounded submit px-3" value="Login">
</div>
<div style="text-align: right !important;" class="form-group">
<a style="font-size: 12px !important;" href="#pwdChgModal" data-toggle="modal" >Password Change</a>
</div>
<!-- SSO 로그인 버튼 (비상모드 시 숨김) -->
<c:if test="${not emergencyMode}">
<!-- <div class="form-group">
<input type="button" id="btn_sso_login" class="form-control btn btn-success rounded submit px-3"
value="SSO Login">
</div> -->
</c:if>
<p style="color:red;"><%=resultMsg %></p>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="pwdChgModal" tabindex="-1" role="dialog" aria-labelledby="pwdChgModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="pwdChgModalLabel">Password 설정</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">X</span>
</button>
</div>
<form name="form" id="modalLoginForm" action="<c:url value="/changePassword.do"/>" method="post">
<div class="modal-body">
<div class="form-group d-flex">
<input type="text" name="resetUserId" class="form-control rounded-left" placeholder="User Id" required>
</div>
<div class="form-group d-flex">
<input type="password" name="resetPassword" class="form-control rounded-left" placeholder="<%= localeMessage.getString("login.placeholderCurrentPassword") %>" autocomplete="off" required>
</div>
<p><%= localeMessage.getString("login.toChangePasswordMessage") %></p>
<div class="form-group d-flex">
<input type="password" name="changePassword" class="form-control rounded-left" placeholder="<%= localeMessage.getString("login.placeholderChangePassword") %>" autocomplete="off" required>
</div>
<div class="form-group d-flex">
<input type="password" name="confirmPassword" class="form-control rounded-left" placeholder="<%= localeMessage.getString("login.placeholderConfirmationPassword") %>" autocomplete="off" required>
</div>
</div>
<div class="modal-footer">
<input type="button" id ="changePwd" class="form-control btn btn-primary rounded submit px-3" value="변경">
</div>
</form>
</div>
</div>
</div>
<!-- SMS 인증 모달 -->
<div class="modal fade" id="smsAuthModal" tabindex="-1" role="dialog" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">SMS 인증</h5>
</div>
<div class="modal-body">
<p>인증번호가 <strong><span id="smsAuthMaskedPhone"></span></strong>로 발송되었습니다.</p>
<div class="form-group">
<input type="text" id="smsAuthCode" class="form-control"
placeholder="인증번호 6자리" maxlength="6"
onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div>
<p class="text-muted">남은 시간: <span id="smsAuthRemainingTime" class="text-danger font-weight-bold">60</span>초</p>
</div>
<div class="modal-footer">
<button type="button" id="btnSmsResend" class="btn btn-secondary" onclick="resendSmsAuthCode()" disabled>재발송</button>
<button type="button" class="btn btn-primary" onclick="verifySmsAuthCode()">확인</button>
<button type="button" class="btn btn-danger" onclick="cancelSmsAuth()">취소</button>
</div>
</div>
</div>
</div>
</body>
</html>