shjung 2 tahun lalu
induk
melakukan
cf7658c2c4

+ 15 - 2
src/main/java/com/its/op/controller/its/LoginController.java

@@ -11,6 +11,7 @@ import com.its.op.security.WebMvcConfig;
 import com.its.op.service.its.LoginService;
 import com.its.op.service.its.oper.TbUserInfrService;
 import com.its.utils.CookieUtils;
+import com.its.utils.ItsUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -58,6 +59,19 @@ public class LoginController {
 //        return this.service.login(req);
 //    }
 
+    @PostMapping("/keep-alive.do")
+    public String postKeepAlive(HttpServletRequest request, HttpServletResponse response) {
+        HttpSession session = request.getSession(false);
+        if (session != null) {
+            UserInfrVo userInfr = (UserInfrVo) session.getAttribute(WebConstants.LOGIN_USER);
+            if (userInfr != null) {
+                session.setMaxInactiveInterval(WebConstants.MAX_INACTIVE_SESSION_TIMEOUT);
+                log.info("keepAlive User: {}, {}", userInfr.getUserId(), userInfr.getOperSystId());
+            }
+        }
+        return "success";
+    }
+
     /**
      * 로그인
      * @param login
@@ -74,14 +88,12 @@ public class LoginController {
     public ModelAndView getLogin(HttpServletRequest request, HttpServletResponse response) {
         Authentication auth = SecurityContextHolder.getContext().getAuthentication();
         if (auth != null) {
-            //log.info("getLogin3: auth, {}", auth.toString());
             expiredCookie(response, WebConstants.USER_UUID);
             expiredCookie(response, WebConstants.USER_TIME);
             new SecurityContextLogoutHandler().logout(request, response, auth);
         }
         HttpSession session = request.getSession(false);
         if (session != null) {
-            //log.error("getLogin3: session, {}", session.toString());
             session.invalidate();   // session remove
         }
         return new ModelAndView("redirect:" + WebConstants.LOGIN_PAGE_URI);
@@ -177,6 +189,7 @@ public class LoginController {
         if (session != null) {
             UserInfrVo userInfr = (UserInfrVo) session.getAttribute(WebConstants.LOGIN_USER);
             if (userInfr != null) {
+                userInfr.setLogoutHms(ItsUtils.getSysTime());
                 log.info("logout User: {}, {}", userInfr.getUserId(), userInfr.getOperSystId());
             }
             session.invalidate();   // session remove

+ 2 - 2
src/main/java/com/its/op/scheduler/ItsOpSigPhaseListener.java

@@ -93,9 +93,9 @@ public class ItsOpSigPhaseListener {
 
         stopWatch.stop();
         long totalTimeMillis = stopWatch.getTotalTimeMillis();
-        //if (totalTimeMillis > 1000) {
+        if (totalTimeMillis > 1000) {
             log.info("--RUN: ItsOpSigPhaseListener.run: {}, {} ms.", Thread.currentThread().getName(), totalTimeMillis);
-        //}
+        }
 
         long delayMillis = delayMilliSeconds - totalTimeMillis;
         if (delayMillis < 0) {

+ 2 - 2
src/main/java/com/its/op/scheduler/ItsOpSigPhaseListener_backup.java

@@ -79,9 +79,9 @@ public class ItsOpSigPhaseListener_backup implements DisposableBean, Runnable {
 
         stopWatch.stop();
         long totalTimeMillis = stopWatch.getTotalTimeMillis();
-        //if (totalTimeMillis > delayMilliSeconds) {
+        if (totalTimeMillis > delayMilliSeconds) {
             log.warn("--END: ItsOpSigPhaseListener.run: {}, {} ms.", Thread.currentThread().getName(), totalTimeMillis);
-        //}
+        }
         long delayMillis = delayMilliSeconds - totalTimeMillis;
         if (delayMillis < 0) {
             delayMillis = 500;

+ 3 - 0
src/main/java/com/its/op/security/UserInfrVo.java

@@ -60,6 +60,9 @@ public class UserInfrVo implements UserDetails {
     @ApiModelProperty("운영시스템ID")  // Y VARCHAR(7)
     private String operSystId;
 
+    private String loginHms;
+    private String logoutHms;
+
     public TbUserInfrDto toDto() {
         return TbUserInfrDto.builder()
                 .userId(this.userId)

+ 3 - 0
src/main/java/com/its/op/security/WebConstants.java

@@ -9,4 +9,7 @@ public interface WebConstants {
     String USER_OPER_SYST_ID = "OPER_SYST_ID";
     String LOGIN_USER = "loginUser";
 
+    int DEFAULT_SESSION_TIMEOUT = 1800;     // 30분 = 1800 초
+    int MAX_INACTIVE_SESSION_TIMEOUT = 30;
+
 }

+ 2 - 2
src/main/java/com/its/op/security/WebController.java

@@ -30,10 +30,10 @@ public class WebController {
      */
     @GetMapping({"", "/", "/index.do", "/login.do"})
     public ModelAndView getLogin(HttpServletRequest request, HttpServletResponse response) {
-        log.error("getLogin1: {}", request);
+        log.info("getLogin1: {}", request);
         Authentication auth = SecurityContextHolder.getContext().getAuthentication();
         if(auth != null) {
-            log.error("getLogin2: {}", auth);
+            log.info("getLogin2: {}", auth);
             return new ModelAndView("redirect:" + WebConstants.DEFAULT_URI);
             //new SecurityContextLogoutHandler().logout(request, response, auth);
         }

+ 76 - 0
src/main/java/com/its/op/security/WebHttpSessionListener.java

@@ -0,0 +1,76 @@
+package com.its.op.security;
+
+import com.its.op.dto.its.LoginDto;
+import com.its.op.service.its.LoginService;
+import com.its.utils.ItsUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Slf4j
+@RequiredArgsConstructor
+@Component
+//public class WebHttpSessionListener implements ApplicationListener<SessionDestroyedEvent> {
+//      // 상용 웹서버에서 HttpSessionListener 작동 안될때
+//    @Override
+//    public void onApplicationEvent(SessionDestroyedEvent event) {
+//    }
+//}
+public class WebHttpSessionListener implements HttpSessionListener {
+
+    private final LoginService service;
+
+    @Override
+    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
+        HttpSession session = httpSessionEvent.getSession();
+        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        if (session != null) {
+            String creationTime = sdfDate.format(new Date(session.getCreationTime()));
+            String lastAccessTime = sdfDate.format(new Date(session.getLastAccessedTime()));
+            UserInfrVo userInfr = (UserInfrVo) session.getAttribute(WebConstants.LOGIN_USER);
+            if (userInfr != null) {
+                session.setMaxInactiveInterval(WebConstants.MAX_INACTIVE_SESSION_TIMEOUT);
+                log.info("Session Created: User: {}, {}", userInfr.getUserId(), userInfr.getOperSystId());
+            }
+            log.error("Session Created: {}, {}, {}", creationTime, lastAccessTime, session.getMaxInactiveInterval());
+        }
+        log.error("Session Created: {}", httpSessionEvent.getSession().getMaxInactiveInterval());
+    }
+
+    @Override
+    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
+        HttpSession session = httpSessionEvent.getSession();
+        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        if (session != null) {
+            String creationTime = sdfDate.format(new Date(session.getCreationTime()));
+            String lastAccessTime = sdfDate.format(new Date(session.getLastAccessedTime()));
+            UserInfrVo userInfr = (UserInfrVo) session.getAttribute(WebConstants.LOGIN_USER);
+            if (userInfr != null) {
+                if (StringUtils.isNotEmpty(userInfr.getUserId()) && StringUtils.isEmpty(userInfr.getLogoutHms())) {
+                    LoginDto.LogoutReqDto req = LoginDto.LogoutReqDto.builder()
+                            .user_id(WebMvcConfig.decUserId(userInfr.getUserId()))
+                            .login_hms(userInfr.getLoginHms())
+                            .build();
+                    this.service.logout(req);
+                    userInfr.setLogoutHms(ItsUtils.getSysTime());
+                    log.info("logout history: {}", req);
+                }
+                log.info("Session Destroyed: User: {}, {}, {}, {}", userInfr.getUserId(), userInfr.getOperSystId(), userInfr.getLoginHms(), userInfr.getLogoutHms());
+            }
+            else {
+                log.error("Session Destroyed: {}, {}, {}", creationTime, lastAccessTime, session.getMaxInactiveInterval());
+            }
+        }
+        else {
+            log.error("Session Destroyed: {}", httpSessionEvent);
+        }
+    }
+
+}

+ 2 - 1
src/main/java/com/its/op/security/WebLoginSuccessHandler.java

@@ -55,7 +55,8 @@ public class WebLoginSuccessHandler implements AuthenticationSuccessHandler {
         this.cnncHsRepo.insertData(cnncHs.getOperSystId(), cnncHs.getLoginHms(), cnncHs.getUserId(), cnncHs.getLogoutHms());
         log.info("login history: {}, {}", cnncHs, remoteIp);
 
-        //log.info("cnncHs: {}, {}", cnncHs.getUserId(), cnncHs.getLoginHms());
+        userInfr.setLoginHms(cnncHs.getLoginHms());
+        userInfr.setLogoutHms("");
 
         String uri = WebConstants.DEFAULT_URI;
         String domain = "/";

+ 1 - 1
src/main/resources/application.yml

@@ -57,7 +57,7 @@ spring:
     context-path: /
     session:
       tracking-mode: cookie
-      timeout: 600
+      timeout: 1200
     multipart:
       enabled: true
       file-size-threshold: 10MB

+ 32 - 14
src/main/resources/static/application/op/00.main/main.html

@@ -239,24 +239,42 @@
                 })
                 .dxMenu("instance");
             $('.log-out').on('click', () => logoutLocation());
+
+            let isF5 = false;
             function logoutLocation() {
                 isF5 = true;
                 location.href = "/api/auth/logout.do";
             }
-            let isF5 = false;
-            window.addEventListener("keydown", (event)=>{
-                if (event.code === 'F5') isF5 = true;
-                if (event.ctrlKey === true && event.shiftKey === true && event.code === 'KeyR') isF5 = true;
-                if (event.ctrlKey === true && event.code === 'KeyR') isF5 = true;
-            })
-            window.addEventListener("unload", function() {
-                if (isF5 === false){
-                    navigator.sendBeacon("/api/auth/logout.do");
-                }
-                else {
-                    isF5 = false;
-                }
-            });
+
+            setInterval(keepAlive, 3000);
+            keepAlive();
+
+            function keepAlive(){
+                $.ajax({
+                    type:"POST"
+                    , dataType:'text'
+                    , url:"/api/auth/keep-alive.do"
+                    , success : function(data) {
+                        console.log("keep-alive: " + data);
+                    }, error:function(x,error){
+                        console.error("keep-alive: 처리중 오류가 발생했습니다.");
+                    }
+                });
+            }
+
+            // window.addEventListener("keydown", (event)=>{
+            //     if (event.code === 'F5') isF5 = true;
+            //     if (event.ctrlKey === true && event.shiftKey === true && event.code === 'KeyR') isF5 = true;
+            //     if (event.ctrlKey === true && event.code === 'KeyR') isF5 = true;
+            // })
+            // window.addEventListener("unload", function() {
+            //     if (isF5 === false){
+            //         navigator.sendBeacon("/api/auth/logout.do");
+            //     }
+            //     else {
+            //         isF5 = false;
+            //     }
+            // });
         </script>
     </body>
 </html>

+ 5 - 1
src/main/resources/static/application/op/09.cros/03.statistics/01.drct-statistics/drct-statistics.js

@@ -310,7 +310,11 @@ function recvListData(jsonData){
             dataMap.forEach((obj)=>{
                 let data = getFormatData(obj, columns);
                 series.map((item)=>{
-                    item.data.push(data[item.id]);
+                    let val = data[item.id];
+                    if (val === undefined) {
+                        val = 0;
+                    }
+                    item.data.push(val);
                 })
                 xAxis.push(data.stat_dt);
                 formatData.push(data);