인터셉터 -> 블록필터를 구현할 수 있다
bitcamp-spring-webmvc src14 app2 controller04~
필터, 인터셉터, AOP
AOP란 : 객체 메서드 호출 앞뒤로 필터를 꼽는다.
인터셉터 : jsp, view를 실행하기 전에 필터를 꼽는 기술
서블릿 필터 : 서블릿 실행 전에 필터를 꼽는 기술
AOP는 모든 객체에 대해 다 꼽을수 있다. 주로 serviceDAO에 꼽을때 많이 사용
인터셉터 : HandlerInterceptor를 구현한다. 세개의 메서드가 있음.
// 인터셉터 만들기
// => 프론트 컨트롤러와 페이지 컨트롤러 사이에 코드를 삽입하는 기술
// => 프론트 컨트롤러와 뷰 컴포넌트 사이에 코드를 삽입하는 기술
//
// 인터셉터를 배치하기
// => 프론트 컨트롤러의 IoC 설정 파일에 배치 정보를 추가한다.
//
public class Controller04_1_Interceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 페이지 컨트롤러의 핸들러를 호출하기 전에 이 메서드가 먼저 호출된다.
System.out.println("Interceptor1.preHandle()");
// 다음 인터셉터나 페이지 컨트롤러를 계속 실행하고 싶다면 true를 리턴한다.
// 여기서 요청 처리를 완료하고 싶다면 false를 리턴한다.
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 페이지 컨트롤러의 핸들러가 리턴한 후 이 메서드가 호출된다.
System.out.println("Interceptor1.postHandle()");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
// JSP를 실행한 후 이 메서드가 호출된다.
System.out.println("Interceptor1.afterCompletion()");
}
}
만들었다고 다가 아니라 배치를 해줘야한다.
app2config
implements WebMvcConfigurer
위 클래스를 구현한다.
addInterceptors
이 메서드 구현.
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 1) 모든 요청에 대해 실행할 인터셉터 등록하기
// => 인터셉터를 적용할 URL을 지정하지 않으면
// 현재 프론트 컨트롤러의 모든 요청에 대해 적용된다.
//
registry.addInterceptor(new Controller04_1_Interceptor1());
// 2) 특정 요청에 대해 실행할 인터셉터 등록하기
// => 패턴: /c04_1/*
// 적용 가능:
// /c04_1/x
// /c04_1/y
// 적용 불가:
// /x
// /c03_1/x
// /c04_1/a/x
// /c04_1/a/b/x
// 즉, /c04_1/ 바로 밑의 있는 자원에 대해서만 인터셉터를 적용한다.
//
registry.addInterceptor(new Controller04_1_Interceptor2())//
.addPathPatterns("/c04_1/*");
// 3) 특정 요청에 대해 실행할 인터셉터 등록하기
// => 패턴: /c04_1/**
// 적용 가능:
// /c04_1/x
// /c04_1/y
// /c04_1/a/x
// /c04_1/a/b/x
// 적용 불가:
// /x
// /c03_1/x
// 즉, /c04_1/ 의 모든 하위 경로에 있는 자원에 대해서만 인터셉터를 적용한다.
//
registry.addInterceptor(new Controller04_1_Interceptor3())//
.addPathPatterns("/c04_1/**");
// 4) 특정 요청에 대해 인터셉터 적용을 제외하기
// => 패턴: /c04_1/** (include), /c04_1/a/** (exclude)
// 적용 가능:
// /c04_1/x
// /c04_1/y
// /c04_1/b/x
// /c04_1/b/c/x
// 적용 불가:
// /x
// /c03_1/x
// /c04_1/a/x
// /c04_1/a/b/x
// 즉, /c04_1/ 의 모든 하위 경로에 있는 자원에 대해서만 인터셉터를 적용한다.
// 단 /c04_1/a/ 의 모든 하위 경로에 있는 자원은 제외한다.
registry.addInterceptor(new Controller04_1_Interceptor4())//
.addPathPatterns("/c04_1/**") //
.excludePathPatterns("/c04_1/a/**");
}
위 메서드 해석 :
(인터셉터등록기 등록기) {
등록기.추가(새로운 컨트롤러04_1에서사용할인터셉터());
}
자바프로젝트