본문 바로가기
Spring/Spring MVC 5

Interceptor

코동이 2020. 5. 27.

spring Framework의 AOP를 적용한 Spring MVC의 요소이다.

Interceptor는 요청주소에 대해 관심을 가지고 있다.

요청주소를 확인하여 Controller의 메서드를 호출 하기 전이나 후에 다른 메서드를 호출 할 수 있도록 가로 채 간다.

 

메서드의 코드가 중복되는 부분이 있다면 Interceptor를 통해 처리할 수 있다.

로그인 여부 확인, 등급별 서비스 권한 확인 등..

 

implements HandlerInterceptor

extends HandlerInterceptorAdaptor

2가지 모두 가능하다.

 

Interceptor는 보통 3가지 메소드를 구현한다.

preHandle() - 메서드 호출 전 (return false이면 이후는 실행하지 않고 종료된다.)

postHandle() - 메서드 호출 후

afterCompletion() - View 처리까지 완료 후

 

*Interceptor 구현 방법

1. HandlerInterceptor(혹은 HandlerInterceptorAdaptor)를 implements하거나 extends 한 TestInterceptor.java 에 Intercept 할 내용 정의

 

2. ServletAppContext.java에 addInterceptor 구현하며, TestInterceptor.java 객체 등록 및 경로 지정

 

 

1.  HandlerInterceptor(혹은 HandlerInterceptorAdaptor)를 implements하거나 extends 한 TestInterceptor.java 에 Intercept 할 내용 정의

<TestInterceptor.java>

//과거에는 추상메소드로 다 개발자가 정의해야 했으나, 이제는 default로 정의되어 있다.
public class TestInterceptor1 implements HandlerInterceptor {
	
	//Controller 메서드 호출 전
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		return true;
	}

	//Controller 메서드 호출 후
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
	}
	
	//View 처리까지 완료 후
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
	}
}

 

 

2. ServletAppContext.java에 addInterceptor 구현하며, TestInterceptor.java 객체 등록 및 경로 지정하기

 

//인터셉트를 등록한다.
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.addInterceptors(registry);
		TestInterceptor1 inter1 = new TestInterceptor1();
		
		InterceptorRegistration reg1 = registry.addInterceptor(inter1);
		
		//test1에 대한 요청이 오면, Controller로 바로 가지 않고 Interceptor를 들리게 된다.
		reg1.addPathPatterns("/test1");
		//reg4.addPathPatterns("/test1","/test2");
		//reg5.addPathPatterns("/sub1/test3","/sub1/test4");
		//reg6.addPathPatterns("/*");
		//reg6.addPathPatterns("/sub1/*");
		//reg6.addPathPatterns("/**");
		//reg6.excludePathPatterns("/*");
	}

2개의 페이지에 대해 중복하여 Interceptor를 쓰려면 addPathPatterns("/sub1/test3", "/sub1/test4")를 사용한다.

1개의 "어떠한" 경로에 상관없이 쓰려면 addPathPatterns("/*")을 사용한다.

1개를 넘어서서 몇개의 어디든지의 경로에 추가하고 싶으면 addPathPatterns("/**")을 사용한다.

특정 경로를 제외하고 싶으면 excludePathPatterns("/*")를 사용한다. 

 

즉, 클라이언트 요청 시, 해당 경로가 addInterceptor()에 있으면, TestController.java의 Controller로 바로 가지 않고 먼저 TestController.java에 가서 preHandle을 실행한다. 

 

실행결과순서는 다음과 같다.

 

===========

preHandle

View 실행

postHandle

afterCompletion

===========

 

 

preHandle의 return이 false일 경우

===========

preHandle

===========

 

 

 

 

*참고

 

@Controller
public class TestController {
	
	@GetMapping("/test1")
	public String test1() {
		return "test1";
	}
	
	@GetMapping("/test2")
	public String test2() {
		return "test2";
	}
	
	@GetMapping("/sub1/test3")
	public String test3() {
		return "test3";
	}
	
	@GetMapping("/sub1/test4")
	public String test4() {
		return "test4";
	}
}

TestController.java의 내용은 일반적이다. Interceptor와 관련된 설정은 모두 TestInterceptor.java에서 한다.

반응형

'Spring > Spring MVC 5' 카테고리의 다른 글

MyBatis  (0) 2020.05.27
예외처리  (0) 2020.05.27
Validator 커스터마이징  (0) 2020.05.27
JSR-303 / JSR-383  (0) 2020.05.27
에러 메시지 커스터마이징  (0) 2020.05.27