AOP 설정을 활용한 세션체크 AOP Session Check
AOP 설정을 활용한 세션체크 AOP Session Check
/****20170331 update ********/
세션체크는 AOP를 활용한 방식보다는 Interceptor를 활용하는 방식을 추천합니다.
용도에 따라 Filter는 URI에 따른 인코딩, Interceptor는 로그인이나 권한, AOP는 로깅이나 에러처리에 적합합니다.
Link : Spring Interceptor 활용 세션 설정 ajax, 페이지연결 구분
우선 AOP 에 대해 이해와 기본 설정방법을 알아야 하니
아래의 Link 를 참고 하도록 합니다.
Link : Aop 설정을 활용한 모든 메소드 수행시간 출력
Link 를 참고해 Around aop 설정을 했다면 모든 메소드의 수행 시간이 출력 될 것입니다.
이제 메소드가 수행되기 전에 세션에 저장된 값이 없다면 로그인 페이지로 Redirect 하는 소스를 추가해봅시다.
원리는 간단합니다.
Around AOP 설정으로 Pointcut 에 해당하는 모든 메소드 실행 시에 Advice 클래스가 실행 될 것입니다.
로그인 관련 메소드에는 세션값이 없을 것이니 제외를 하고
(메소드명으로 제외, requst.getRequestURL()을 사용해 URL로 구분 하셔도 됩니다. )
나머지 메소드가 실행될 때 세션 값이 없으면 로그인 페이지로 리다이렉트 하면 됩니다.
소스는 어려운 부분이 없으니 해보시면서 확인하시면 될 것 같습니다 ㅎ
소스Text
public class Advice {
public Object sessionChk(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("advice");
HttpServletRequest request = null;
Model m = null;
String method = pjp.getSignature().getName();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for(Object o:pjp.getArgs()){
if(o instanceof HttpServletRequest){
request = (HttpServletRequest) o;
}else if(o instanceof Model){
m = (Model) o;
}
}
if(request != null){
HttpSession session = request.getSession();
OprSet set = (OprSet) session.getAttribute("oprInfo");
if(set == null){
return "redirect:/";
}
if(m != null){
Gson gson = new Gson();
m.addAttribute("menuInfo", gson.toJson(set.getPageInfo()));
m.addAttribute("oprInfo", gson.toJson(set.getOprInfo()));
}
}
Object returnObj = pjp.proceed();
stopWatch.stop();
System.out.println("############# "+method+"() Method Performance time : "+stopWatch.getTotalTimeMillis()+"(ms) #############");
return returnObj;
}
}
세션에 로그인한 사용자의 정보(oprInfo) 값이 없으면 초기화면(로그인)으로 리다이렉트 하고,
모델에 메뉴정보와 사용자정보를 넣는 방식입니다.
페이지 이동 시 반복적으로 세션체크가 일어나며, 이렇게 구현한 이유는 중복 로그인을 방지하기 위함입니다.
(중복 로그인 시 로그인페이지로 이동)