Programing/Spring

AOP 설정을 활용한 세션체크 AOP Session Check

리커니 2017. 3. 15. 10:59
반응형

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) 값이 없으면 초기화면(로그인)으로 리다이렉트 하고,

모델에 메뉴정보와 사용자정보를 넣는 방식입니다.

페이지 이동 시 반복적으로 세션체크가 일어나며, 이렇게 구현한 이유는 중복 로그인을 방지하기 위함입니다.

(중복 로그인 시 로그인페이지로 이동)

반응형