Spring MVC - Interceptor

2020. 9. 21. 20:02Java/Spring

반응형

Interceptor

 

- Spring Framework 강좌에서 배웠던 AOP를 적용한 Spring MVC의 요소다.

- Interceptor는 요청 주소에 대해 관심을 갖고 요청이 발생하게 되면 요청 주소를 확인하여 Controller의 메서드를 호출 하기 전이나 후에 다른 메서드를 호출 할 수 있도록 가로 채 가는 개념이다..

 

- 요청 발생 시 호출되는 메서드의 코드가 중복 되는 부분이 있을 때 Interceptor를 통해 처리하게 된다.

- 로그인 여부 확인, 등급별 서비스 사용 권한 확인 등의 작업을 처리할 때 많이 사용한다.

 

 


Interceptor 구현

 

- InterceptorHandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdapter를 상속받은 클래스를 만들고 다음 메서드를 구현한다.

- preHandle : Controller의 메서드가 호출되기 전 호출됩니다. 이 메서드가 false를 반환하면 코드의 흐름이 중단된다.

- postHandle : Controller의 메서드의 수행이 완료되고 view 처리를 수행하기 전에 호출된다.

- afterCompletion : view 처리까지 완료되고 응답결과가 브라우저로 전달되기 전에 호출된다.

 

패키지를 새로 생성하고 아래와 같이 HandlerInterceptor를 상속받아 객체를 생성한다.

 

public class TestInterceptor1 implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		System.out.println("TestInterceptor1 - prehandler");
		return true;
	}
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("TestInterceptor1 - postHandle");
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("TestInterceptor1 - afterCompletion");
	}
}

 

위에서 생성한 interceptor를 등록하기 위해 ServletAppcontext에 메서드를 작성한다.

 

@Override
public void addInterceptors(InterceptorRegistry registry) {
	// TODO Auto-generated method stub
	WebMvcConfigurer.super.addInterceptors(registry);
		
	TestInterceptor1 inter1 = new TestInterceptor1();
	InterceptorRegistration reg1 = registry.addInterceptor(inter1);
	reg1.addPathPatterns("/test1");
}

test1의 요청이 들어오면 inter1이 가르키는 인터셉터 클래스가 실행된다.

reg1.addPathPatterns("/test1","/test2");

위 처럼 경로를 추가하면 여러 경로에 대해 interceptor를 수행 가능하다.

 

@Override
public void addInterceptors(InterceptorRegistry registry) {
	// TODO Auto-generated method stub
    WebMvcConfigurer.super.addInterceptors(registry);
		
    TestInterceptor1 inter1 = new TestInterceptor1();
    TestInterceptor2 inter2 = new TestInterceptor2();
    TestInterceptor3 inter3 = new TestInterceptor3();
    
    InterceptorRegistration reg1 = registry.addInterceptor(inter1);
    InterceptorRegistration reg2 = registry.addInterceptor(inter2);
    InterceptorRegistration reg3 = registry.addInterceptor(inter3);
    
    reg1.addPathPatterns("/test1");
    reg2.addPathPatterns("/test2");
    reg3.addPathPatterns("/test1");
}

위 처럼 여러 인터셉터를 정의하여 사용 가능하다.

 


 

 

pattern

 

- * : 이름 하나를 의미하며 글자수, 글자 등 제한이 없다.

- ? : 글자하나를 의미한다.

- ** : 하위 이름까지 포함하여 글자수, 글자 등 제한이 없다.

 

아래와 같이 사용 가능하다.

reg1.addPathPatterns("/*");
reg2.addPathPatterns("/**");
reg3.addPathPatterns("/**/sub");

 

 

Pattern 등록

 

- addPathPatterns, <mapping> : Interceptor가 가로채 갈 주소를 등록한다.

- excludePathPatterns, <exclude-mapping> : Interceptor가 가로채 가지 않을 주소를 등록한다.

 

reg3.excludePathPatterns("/test1");

위처럼 등록하면 reg3 인터셉터는 test1 경로에 실행이 되지 않는다.

반응형