Web/Java+Spring

Interceptor

WakaraNai 2021. 7. 13. 00:45
728x90
반응형

인터셉터(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로 사용합니다.

728x90
반응형

'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