Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 접근장치
- mysql
- eGov
- Firebase
- 알고리즘
- URLRewirte
- @Scheduled
- ua-parser
- scheduled
- User-Agent
- 브라우저
- Oracle
- Tomcat
- Was
- web server
- FCM
- WINDOW11
- TailMe
- AES
- db
- programmers
- Login
- WebtoB
- Java
- 개발자도구
- 암호화
- JEUS
- 물리적주소
- dbms
- window10
Archives
- Today
- Total
HD
로그인 세션 시간 표시 본문
반응형
은행권이나 홈텍스 등에서 많이 볼수있는 화면이다. 아래사진과 같이 고객의 요청으로 해당 시간을 표시되고 시간이 다되면 로그아웃이 되는 기능을 구현해보았다. (연장기능은 제외)
[작업]
추가적으로 작업할 소스는 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
[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
반응형
'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