-
JSP 피피티 07강 Spring InterceptorJSP 피피티 2020. 9. 1. 11:28
Handler Interceptor
-웹 브라우저가 보내는 컨트롤러의 실행 요청을 중간에 가로채서 어떠한 일을 수행하게 하는 기능
-모든 웹 페이지가 공통적으로 동일하게 실행해야 하는 기능들을 구현할 수 있다.
활용 예시
- 컨트롤러가 실행되기 직전
-모든 웹 페이지의 실행 정보와 접속한 클라이언트의 정보를 로그로 기록한다.
-로그인 여부를 판별하여 회원 전용 페이지에 접근할 수 있는 가를 판단한다. - 컨트롤러가 실행된 직후
-페이지가 실행 시간을 측정하여 이 페이지에 얼마나 머물렀는가를 로그로 남겨 컨텐츠의 인기도를 측정할 수 있는 데이터를 남긴다.
src/study.spring.simplespring.interceptor/AppInterceptor.java
package study.spring.practicespring.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import lombok.extern.slf4j.Slf4j; @Slf4j public class AppInterceptor extends HandlerInterceptorAdapter {@Override /** * Controller 실행 요청 전에 수행되는 메서드 * 클라이언트의 요청을 컨트롤러에 전달 하기 전에 호출된다. * return 값으로 boolean 값을 전달하는데 false인 경우 controller를 실행 시키지 않고 요청을 종료한다. * 보통 이곳에서 각종 체크작업과 로그를 기록하는 작업을 진행한다. */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.debug("AppInterceptor.preHandle 실행됨"); return super.preHandle(request, response, handler); } /** * view 단으로 forward 되기 전에 수행. * 컨트롤러 로직이 실행된 이후 호출된다. * 컨트롤러 단에서 에러 발생 시 해당 메서드는 수행되지 않는다. * request로 넘어온 데이터 가공 시 많이 사용된다. */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.debug("AppInterceptor.postHandle 실행됨"); super.postHandle(request, response, handler, modelAndView); } /** * 컨트롤러 종료 후 view가 정상적으로 랜더링 된 후 제일 마지막에 실행이 되는 메서드. */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.debug("AppInterceptor.afterCompletion 실행됨"); super.afterCompletion(request, response, handler, ex); } /** * Servlet 3.0부터 비동기 요청이 가능해짐에 따라 비동기 요청 시 * PostHandle와 afterCompletion메서드를 수행하지 않고 이 메서드를 수행하게 된다. * 거의 사용안함 */ @Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.debug("AppInterceptor.afterConcurrentHandlingStarted 실행됨"); super.afterConcurrentHandlingStarted(request, response, handler); } }
이렇게 스프링 동작 과정 중간중간 작동할 Interceptor를 설정한다. 이 렇게 설정된 Interceptor가 있어도 있다고 등록을 해야 사용할수 있지 않겠나? 그 등록을 servlet-context.xml 에다 하는거 같다. 왜냐면 스프링 동작하는 순서가 request가 들어 왔을때 servlet-context.xml > controller(HomeController.java) > servlet-context.xml에 값을 리턴받아와 > home.jsp 실행 / 이 중간중간(>)에 interceptor가 들어가는거 같음
preHandler(컨트롤러 실행 전), postHandler(view실행 전), afterCompletion(view실행 후), afterConcurrentHandlingStarted < 잘 안쓰인다니까 쓸때 공부하기
'JSP 피피티' 카테고리의 다른 글
JSP 피피티 11강 서비스레이어 (0) 2020.09.05 JSP 피피티 10강 Spring MyBatis (0) 2020.09.03 JSP 피피티 07 Spring Framework (0) 2020.08.31 JSP 피피티 04강 Session (2) 2020.08.23 JSP 피피티 06강 쿠키 (0) 2020.08.23 - 컨트롤러가 실행되기 직전