BLOG ARTICLE 강제로 로그인 페이지 | 1 ARTICLE FOUND

  1. 2012.04.04 [Spring 3.0] @Aspect 어노테이션을 이용한 AOP 적용 - 로그인, 세션


@Aspect annotation 기반 AOP 를 구현해서, 

1. 로그인 하지 않은 사용자가, 로그인페이지를 제외한 다른페이지에 접근했을 때나,

2. 접근권한이 없는(세션값) 사용자가, 접근할 수 없는 페이지에 접근했을 경우 등

  로깅이나, 공통기능을 사이트 전반에 적용시켜야 할 때 이용한다.

@Aspect 어노테이션은 AspectJ 5버전에 새롭게 추가된 어노테이션으로서, xml파일에 Advice 및 Pointcut 등의 설정을 하지않고도,

자동으로 Advice를 적용할 수 있다.


먼저 필요한 lib - 

aspectjweaver-1.6.5.jar


일단은  servlet xml 설정

<aop:aspectj-autoproxy />

<bean id="loginAspect" class="com.common.LoginAspect"/>


다음은 advice와 pointcut을 구현한 Aspect 클래스

@Aspect
public class LoginAspect {

	@Pointcut("execution(public * com.admin..*(..))")
	private void adminMethod(){}
	
	@Pointcut("execution(public * com.bbs..*(..))")
	private void bbsMethod(){}
	
	@Pointcut("execution(public * com.common..*(..))")
	private void commonMethod(){}
	
	@Pointcut("execution(public * com.onm.administrator..*(..))")
	private void onmAdministratorMethod(){}
	
	@Pointcut("execution(public * com.onm.membership..*(..))")
	private void onmMembershipMethod(){}
	
	@Pointcut("execution(public * com.onm.report..*(..))")
	private void onmReportMethod(){}
		
	private String[] access_url = {
			};
	
	@Around(value ="adminMethod() || bbsMethod()  || commonMethod()
                                || onmAdministratorMethod() || onmMembershipMethod() || onmReportMethod()")
	public Object trace(ProceedingJoinPoint joinPoint) throws Throwable{

System.out.println("#### LoginAspect 시작 ####");		
		HttpServletRequest request = null;
		HttpServletResponse response = null;
		for ( Object o : joinPoint.getArgs() ){ 
			if ( o instanceof HttpServletRequest ) {
				request = (HttpServletRequest)o;
			} 
			if ( o instanceof HttpServletResponse ) {
				response = (HttpServletResponse)o;
			} 
		}
		try{
			HttpSession session = request.getSession();

				String loginId = (String) session.getAttribute("loginId");
				String userEnterType = (String) session
						.getAttribute("UserEnterType");

				System.out.println("### Margo ==> loginId : " + loginId);
				if (loginId == null || "".equals(loginId)) {
					System.out.println("### Margo ==> in if loginId : "
							+ loginId);
					throw new RuntimeException("먼저 로그인을 하셔야 합니다.");
				}			
		}catch(Exception e){
			
			throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

		}		
		Object result = joinPoint.proceed();
System.out.println("#### LoginAspect 끝 ####");		
		return result;
	}
}


1라인 에 적용한 @Aspect 어노테이션을 적용한 클래스는 advice구현메소드나, pointcut정의를 포함할 수 있게된다.


4 라인에 AspectJ의 pointcut 표현식으로 pointcut을 정의한다. 

execution(수식어패턴 리턴타입 클래스이름패턴 이름패턴(파라미터패턴))

수식어패턴: public, protected 등

각패턴은 * 를 이용하여 모든 값을 표현할 수 있고. '..' 를 이용하여 0개 이상이라는 의미를 표현가능

Controller라고 끝나는 이름의 클래스에만 적용할때는 - execution(public * com.bbs..*Controller.*(..))


5라인 처럼 pointcut 정의 메소드는 무조건 리턴타입이 void여야한다.

   이 메소드는 advice 관련 어노테이션인 @around의 값으로 사용될 메소드이다.


이제 trace메서드를 이용해서, 필요한 처리를 구현하면된다.

!!!!!!!!!!!!!!!! 여기서...중요한게 있다!!!!!!

27라인에서 joinPoint는 수행될 메소드인데, 보통 세션값 이용할때 request에서 빼내오는데

그 원래 해당메소드 파라메타로 HttpServletRequest가 지정되어 있지 않으면, request가 null이 되겠지..


끝으로 51,55라인에서 뿌린 Exception을 잡을 놈도 xml에 정의해야한다.

servlet xml에다가 추가해주자

<bean

class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="java.lang.Exception">

index

</prop>

</property>

</bean>

끝~~



YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST