SpringBoot Session Timeout 설정을 해보겠습니다~ 

 

1. bean을 정의해둔 config 파일에 SessionListener 등록! 

@Bean
public HttpSessionListener httpSessionListener(){
	return new SessionListener();
}

 

2. SessionListener 파일 생성! 

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


public class SessionListener  implements HttpSessionListener{

	@Override
	public void sessionCreated(HttpSessionEvent session) {
		// 초단위로 설정된다. 테스트로 300(5분)으로 설정
        session.getSession().setMaxInactiveInterval(60*5);
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
	}

}

 

3. 시간이 잘 설정되었는지 확인하기! Controller에 세션을 확장할 메소드를 하나 생성한다. 

 

@PostMapping("/extendSession")
ResponseBody
public boolean  extendSession() {
	logger.info("로그인 세션 연장");
	logger.info(request.getSession().getMaxInactiveInterval()); 
	logger.info("==============================");
      
    // 리턴값으론 로그인 여부를 리턴해주고있다. 본인코드에 맞춰 수정하기 
	return 로그인여부(true or false) ; 
}

 

이 메소드를 호출하면 아래 이미지처럼 설정된 시간이 초단위로 출력된다. 

* 설정한 값으로 변경이 안된다면 브라우저 캐시 지우고 다시 실행하자!! 

 

 

Session 만료를 사용자에게 알리기 위해 script 작업을 추가했다. 

main_layout.html 에 스크립트 추가~ ( 전역에서 사용되는 공간에 추가하면 됩니다. )

 

//<![CDATA[
        $(function () {
        	
            // 세션을 5분으로 설정해둬서 5로 설정함! 자기 시간에 맞춰 설정하기
            // 숫자 5는 상수값으로 처리해서 사용하면 좋겠다! 
         	var sessionTimeChecker = 5;
            
            // 1분에 한번씩 인터발을 이용해 남은 시간을 계산한다. 
            var sessionInterval = setInterval(checkSession, 60000);
            
            // 비동기 요청을 캐치해 시간을 리셋해준다. 
            $(document).ajaxStart(function () {
            	if(loginck) { // 로그인 여부 확인 후 세션 리셋 
	            	sessionTimeChecker = 5;
            	} else { 
                	// 로그인이 안된 상태라면 인터발 종료 
            		clearInterval(sessionInterval);	
            	}
             });
            
            
            
            // 1분에 한번씩 호출되는 함수로 1분이 남았을때 alert를 출력해준다. 
            function checkSession() { 
		sessionTimeChecker -= 1; // 1분씩 마이너스해서 남은 시간을 계산한다. 
		console.log("인터발 동작 " + sessionTimeChecker +"  " +  new Date() );
            	
                // 1분이 남은 경우 알림창 띄운다. 
                // 확인버튼을 눌렀으나 이미 로그아웃된 경우는 만료알림 문구를 출력하고 페이지를 새로고침한다.
            	if(sessionTimeChecker == 1) { 
            		if(confirm("장시간 사용되지 않아 1분뒤 자동으로 로그아웃됩니다. \n로그인 시간을 연장하시려면 확인 버튼을 클릭해주세요.")) { 
            			$.post("/extendSession").done(function(data) {
            				if(!data) {
            					alert("유효시간 만료로 로그아웃 되었습니다.");
            					location.reload(); // 리로드되면 로그인화면으로 자동 변경됨 
            				}
            			});
            		}
            	}	
            }
            
            
        });
        
        //]]>

 

* 여러번 반복되는 숫자들은 상수로 처리해서 하나만 수정하면 전부 수정되도록 코딩하는게 좋다.

아래 코드는 샘플로 값을 바로 확인하기 위해 그대로 입력해둠!  


Session을 이용한 로그인 처리~~~!! 

내부에서만 사용하거나 단순한 사이트로 굳이 Security 까지 추가할 필요가 없는 경우 사용하면 좋겠다. 

 

프로세스는 ~~~ 

모든 요청을 감시하는 Interceptor 생성! 

로그인에 성공하면 Session값을 설정하고 

요청이 올때마다 Interceptor가 Session 값이 있는지 확인 후 없다면 로그인페이지로 리턴시키걸로~ 

 

즈아~~ 시작! 

 

1.  Interceptor 생성 
요청이 들어오면 Session 지정해둔 Session 값을 확인하고 없다면 로그인페이지로 리다이렉트 처리한다. 

public class LoginInterceptor extends HandlerInterceptorAdapter {
	private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		
		if( request.getSession().getAttribute(Consts.AUTHORIZED) == null  ) {
			response.sendRedirect(request.getContextPath() +"/login");
			return false;
		}
		return true;
	}
}

 

2. Interceptor 등록! 
모든 요청을 검사하도록  .addPathPatterns("/**") 로 설정 후 
Js, css 파일 등이 들어있는 resource 디렉토리 하위는 무시하도록 exclude 처리한다. 
로그인을 위한 요청도 exclude 처리~~!! 

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter  {
	
	 @Override
	    public void addInterceptors(InterceptorRegistry registry) {
	        registry.addInterceptor(new LoginInterceptor())
	                .addPathPatterns("/**")
	                .excludePathPatterns("/resources/**")
	                .excludePathPatterns("/login/**"); 
	    }
	 
}

 

 

3. Login/out 세션작업~~!! 

(위치는 각자 로그인/아웃 파일에 작성!)

// Login 
// 비밀번호, 잠금여부 등등 모든 조건이 맞아 로그인에 성공하게되면 Session 값을 추가해준다. 
request.getSession().setAttribute(Consts.AUTHORIZED, Consts.AUTHORIZED_VALUE);

// Logout
// 로그아웃시 Session 값을 제거해준다. 
request.getSession().removeAttribute(Consts.AUTHORIZED); 

 

4. Session 시간 설정~ 

초단위 결과를 안쓰고 굳이 (60 * 60 * 24)로 쓴 이유는~ 보고 바로 알수있게 하기 위함~~

 시간 같은건 이렇게 해주면 같이 일하는 사람 편하겠죠?  ( 암산이 빠르면 필요없겠지만.. 나는 좋음.. ^^! ) 

public class SessionListener  implements HttpSessionListener{

	@Override
	public void sessionCreated(HttpSessionEvent session) {
		session.getSession().setMaxInactiveInterval(60 * 60 * 24);// 24 시간으로 설정
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
	}

}

 

 

Session 만료되면 자동으로 로그인페이지로 보내볼까??? 

시간 설정할때 보니 아래 있는 sessionDestroyed가 Session이 만료되면 호출된다고한다. 

요고요고 ~ ↓ 


	@Override
	public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
		 HttpSession session = httpSessionEvent.getSession();
		
	}


음~~

그럼 여기서 로그인 페이지로 redirect해주면 되겠군! 하고 생각할 수 있다. 

자~! 여기서 생각해봐야할건 

sessionDestroyed 메소드는 사용자의 요청으로 호출되는게 아니라

Session이 만료되었을때 호출 된다는 것이다. 

즉 ~ R e q u e s t 가 없 다 는 뜻 ! !  

요청(request)이 없으니 redirect 할곳도 없습니다~ ~!

혹시~~~~ redirect 처리한다고 시간낭비하지 않기로 ..  ^^ 

 

보통 Session 만료 검사를 Interceptor에서 필터링으로 처리하는데 

우린 이미 interceptor 처리하고있으니~ 추가안해도 될듯

 

그래도~~~!! 

Session 만료되기 전 뭔가 알림을  설정하고자 한다면 

스크립트단에서 

setInterval 같은 함수를 이용해 10분 간격으로 체크!~

이벤트가 생기면 체크값을 초기화~ 이벤드가 없어서 5번째까지 온다면 

"세션이 10분 남았음"  표기를 해주는것도 방법일 듯 하다. ~ 

+ Recent posts