@Aspect annotation 기반 AOP 사용
1. 로그인 하지 않은 사용자가, 로그인페이지를 제외한 다른페이지에 접근했을 때
2. 접근권한이 없는(세션값) 사용자가, 접근할 수 없는 페이지에 접근했을 경우 등
로깅이나, 공통기능을 사이트 전반에 적용시켜야 할 때 이용한다.
@Aspect 어노테이션은 AspectJ 5버전에 새롭게 추가된 어노테이션으로서, xml파일에 Advice 및 Pointcut 등의 설정을 하지않고도,
자동으로 Advice를 적용할 수 있다.
#STS를 사용할 경우 메이븐 dependency 추가
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
# spring 환경 설정 xml 파일에 아래 내용을 추가한다.
<aop:aspectj-autoproxy />
<bean id="loginAspect" class="com.common.LoginAspect"/>
# 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>
출처 : http://winmargo.tistory.com/164
'프로그래밍 > spring' 카테고리의 다른 글
전자정부프레임워크 json 설정 (0) | 2016.11.08 |
---|---|
스프링 한글 깨짐 처리 (0) | 2016.05.15 |
Spring3에서 Tiles2 설정 (0) | 2016.04.21 |
Apache Titles 적용하기 (0) | 2016.04.21 |
spring에서 현재의 HttpServletRequest 가져오는 법 (0) | 2016.04.20 |