HD

로그인 세션 시간 표시 본문

JAVA

로그인 세션 시간 표시

hunecenter 2022. 12. 13. 10:05
반응형

은행권이나 홈텍스 등에서 많이 볼수있는 화면이다.  아래사진과 같이 고객의 요청으로 해당 시간을 표시되고 시간이 다되면 로그아웃이 되는 기능을 구현해보았다. (연장기능은 제외)

 

[작업]

추가적으로 작업할 소스는 3개이다. 

 

- filter Java 생성 

  • 사용자가 로그인을 할때 web.xml의 session-conifg에 지정된 시간 cookie를 생성

- web.xml session-config(session 시간), 생성한 filter 등록

- jsp로 사용자 화면구성 

  • script로 cookie를 가져와 사용자 화면에  세션 시간표시

우선 servlet filter를 모르고 작업하는 사람들도 있을수 있기에 한번 읽어보고 이해하고 작업하면 좋겠다.

https://atoz-develop.tistory.com/entry/Servlet-Filter-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

Servlet Filter 사용하기

Servlet Filter 사용하기 Filter의 개념과 사용하는 이유 필터는 서블릿 실행 전, 후에 어떤 작업을 하고자 할때 사용한다. 예를 들어 클라이언트가 보낸 데이터의 암호를 해제한다거나, 서블릿이 실

atoz-develop.tistory.com

 

[JAVA]

package module.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * 
 * @Class Name  : SessionFilter.java
 * @Description :  Session time Filter
 * @Modification Information
 *
 *    수정일              수정자         수정내용
 *    -------  -------  -------------------
 *    2022.12.13.  HD    최초생성
 *
 * @author HD
 * @since 2022.12.13.
 * @version 1.0
 * @see javax.servlet.Filter
 */

public class SessionFilter implements Filter {
	
	/** org.slf4j.Logger */
	private static final Logger LOG = LoggerFactory.getLogger( SessionFilter.class );
	
	/** org.springframework.web.context.WebApplicationContext */
	private WebApplicationContext context;
	
	/**
	 * 필터 초기화
	 * @param filterConfig javax.servlet.FilterConfig
	 * @throws ServletException javax.servlet.ServletException
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		context = WebApplicationContextUtils.getWebApplicationContext( filterConfig.getServletContext() );
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        long serverTime = System.currentTimeMillis();
        long sessionExpireTime = serverTime + httpRequest.getSession().getMaxInactiveInterval() * 1000;
        Cookie cookie = new Cookie("egovLatestServerTime", "" + serverTime);
        //cookie.setSecure(true);
        cookie.setPath("/");
        httpResponse.addCookie(cookie);
        cookie = new Cookie("egovExpireSessionTime", "" + sessionExpireTime);
        cookie.setPath("/");
        
        httpResponse.addCookie(cookie);

        chain.doFilter(request, response);
	}
	
	/**
	 * 필터 종료 메소드
	 */
	@Override
	public void destroy() {
		/*
		 * EMPTY METHOD
		 */
	}


}
 <!-- 2022-12-13 sessionFilter 추가 -->
 <filter>
 	<filter-name>SessionFilter</filter-name>
    <filter-class>module.filter.SessionFilter</filter-class> (패키지명+클래스파일명)
 </filter>
 <filter-mapping>
 	<filter-name>SessionFilter</filter-name>
    <url-pattern>*</url-pattern>
 </filter-mapping>
 
 <!--session 시간 30분 -->
 <session-config>
 	<session-timeout>30</session-timeout>
 </session-config>

[html & script]

<script>
function getCookie(cname) {
	 	  var name = cname + "=";
	 	  var decodedCookie = decodeURIComponent(document.cookie);
	 	  var ca = decodedCookie.split(';');
	 	  for(var i = 0; i <ca.length; i++) {
	 	    var c = ca[i];
	 	    while (c.charAt(0) == ' ') {
	 	      c = c.substring(1);
	 	    }
	 	    if (c.indexOf(name) == 0) {
	 	      return c.substring(name.length, c.length);
	 	    }
	 	  }
	 	  return "";
	 	}
	  
	  	function pad(n, width) {
	  	  n = n + '';
	  	  return n.length >= width ? n : new Array(width - n.length + 1).join('0') + n;
	  	}
	  
		var objLeftTime;
		var objClickInfo;
		var latestTime;
		var expireTime;
		var timeInterval = 1000; // 1초 간격 호출
		var firstLocalTime = 0;
		var elapsedLocalTime = 0;
		var stateExpiredTime = false;
		var logoutUrl = "로그아웃 URL";
		var timer;
	  
		function init() {
			objLeftTime = document.getElementById("leftTimeInfo");
			
			if (objLeftTime == null) {
				console.log("'leftTimeInfo' ID is not exist!");
				return;
			}
			//objClickInfo = document.getElementById("clickInfo");
			//console.log(objLeftTime.textContent);

			latestTime = getCookie("egovLatestServerTime");
			expireTime = getCookie("egovExpireSessionTime");
			//console.log("latestServerTime = "+latestTime);
			//console.log("expireSessionTime = "+expireTime);
			
			elapsedTime = 0;
			firstLocalTime = (new Date()).getTime();
			showRemaining();
			
			timer = setInterval(showRemaining, timeInterval); // 1초 간격 호출
		}

		function showRemaining() {
			elapsedLocalTime = (new Date()).getTime() - firstLocalTime;
			
			var timeRemaining = expireTime - latestTime - elapsedLocalTime;
			if ( timeRemaining < timeInterval ) {
				clearInterval(timer);
				objLeftTime.innerHTML = "00:00:00";
				//objClickInfo.text = '시간만료'; //시간만료
				stateExpiredTime = true;
				alert('로그인 세션시간이 만료 되었습니다.');//로그인 세션시간이 만료 되었습니다.
				//$("#logoutForm").submit();
				// reload content main page
				$("#sessionInfo").hide();

				//parent.frames["_content"].location.href = logoutUrl;
				//parent.frames["_content"].location.reload();

				return;
			}
			var timeHour = Math.floor(timeRemaining/1000/60 / 60); 
			var timeMin = Math.floor((timeRemaining/1000/60) % 60);
			var timeSec = Math.floor((timeRemaining/1000) % 60);
			
			objLeftTime.innerHTML = pad(timeHour,2) +":"+ pad(timeMin,2) +":"+ pad(timeSec,2);
			
		}
  </script>
  
  <html>
  	<!-- 시간변경되는부분 -->
  	<span id="leftTimeInfo">00:00:00</span> 
   </html>

 

[참고]

https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:com:v3.10:sec:login_session_management 

 

egovframework:com:v3.10:sec:login_session_management [eGovFrame]

로그인후 만료시간까지의 남은 시간을 표시한다. 세션에 객체 정보 저장, 취득, 제거의 기능을 갖으며 HttpServletRequest 객체의 HttpSession 정보를 사용하여 처리된다. 유형대상소스설명비고 Filteregovf

www.egovframe.go.kr

 

반응형

'JAVA' 카테고리의 다른 글

FCM(firebase) 연동  (0) 2022.11.07
Java @Scheduled Cron 표현식  (2) 2022.10.04
JAVA 접근장치, 운영체제, 브라우저 확인  (0) 2022.02.12
중복로그인 처리(feat.전자정부)  (0) 2022.01.25
[구글 OTP] java  (4) 2021.09.14
Comments