인터셉터(Interceptor)
- Interceptor는 Dispatcher servlet에서 Handler(Controller)로 요청을 보낼 때, Handler에서 Dispathcer servlet으로 응답을 보낼 때 동작합니다.
- 스프링 DispathcerServlet의 내부 동작
- 클라이언트로부터 요청이 들어왔을 때 필터가 존재하면 필터를 수행
- 아래 사진같은 경우 스프링에서 제공된 charset을 지정하는 필터가 정의되어 있었음
- web.xml이나 그와 같은 일을 하는 부분에 이 필터를 등록
- 필터는 요청을 받기 전, 응답이 나가기 전에 수행됨
- 그 다음에 DispatcherServlet이 수행
- 필터처럼 선처리 작업이 존재한다면 먼저 선처리 작업을 해주고
- HandlerMapping을 통해서 실제 어떤 Handler가 동작을 해야 되는지 이런 부분들을 얻어냄
- Handler 실행. Handler에서 DispatcherServlet으로 View 정보를 넘겨줄 때 tHandlerInterceptor가 동작
- ViewResolver로 View를 찾아서 응답
- 클라이언트로부터 요청이 들어왔을 때 필터가 존재하면 필터를 수행
인터셉터 작성법
- 방법1) HandlerInterceptor 인터페이스 구현하기
- org.springframework.web.servlet.HandlerInterceptor
- 방법2) HandlerInterceptorAdapter 클래스 상속받기
- org.springframework.web.servlet.handler.HandlerInterceptorAdapter
- 이렇게 만든 인터셉트를 가지고
- Java Config을 사용할 경우 WebMvcConfiguerAdapter의 addInterceptors 메소드를 오버라이딩하고 등록해줌
- xml 파일에 사용할 경우 <mvc:interceptors> 요소에 등록
실습 - 인터셉트를 이용해 Controller 공통 로직 처리하기
guestbook 프로젝트에
인터셉터를 적용해서 Controller 메소드의 실행 전과 실행 후의 로그 남기기
인터셉터 생성
kr.or.connect.guestbook.interceptor 패지키를 생성하여
그 안에 LogIntercepter 클래스 파일 생성
package kr.or.connect.guestbook.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LogInterceptor extends HandlerInterceptorAdapter {
// Contoller 메소드가 실행된 후에 실행됨
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(handler.toString() + " 가 종료되었습니다. " + modelAndView.getViewName() + "을 view로 사용합니다.");
}
// Controller 메소드가 실행되기 전에 실행됨
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(handler.toString() + " 를 호출했습니다.");
return true;
}
}
인터셉터 등록
kr.or.connect.guestbook.config 패키지의
WebMvcContextConfiguration 클래스에 아래 함수 추가하기
// 생성한 인터셉터의 객체를 넣어줌
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor());
}
실행하면 java console 화면에 아래 메세지 출력됨
public java.lang.String kr.or.connect.guestbook.controller.GuestbookController.list(int,org.springframework.ui.ModelMap,java.lang.String,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 가 종료되었습니다. list을 view로 사용합니다.
이 때 loginform 페이지로 열어보면
(http://localhost:8082/guestbook/loginform)
이런 메세지가 콘솔화면에 출력됨
public java.lang.String kr.or.connect.guestbook.controller.GuestbookAdminController.loginform() 를 호출했습니다.
public java.lang.String kr.or.connect.guestbook.controller.GuestbookAdminController.loginform() 가 종료되었습니다. loginform을 view로 사용합니다.
로그인을 하고 나오면
이런 메세지가 콘솔화면 출력됨
public java.lang.String kr.or.connect.guestbook.controller.GuestbookController.list(int,org.springframework.ui.ModelMap,java.lang.String,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 를 호출했습니다.
public java.lang.String kr.or.connect.guestbook.controller.GuestbookController.list(int,org.springframework.ui.ModelMap,java.lang.String,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 가 종료되었습니다. list을 view로 사용합니다.
'Web > Java+Spring' 카테고리의 다른 글
Logging (0) | 2021.09.10 |
---|---|
ArgumentResolver (0) | 2021.07.13 |
Spring MVC에서 Session 사용하기 (0) | 2021.07.08 |
RestController - Rest API by Spring MVC (0) | 2021.06.10 |
Layered Architecture 실습 - 방명록 (0) | 2021.06.09 |