[Spring] Controller 실행 전/후의 요청을 낚아채는 Interceptor
🙋🏻♀️ Interceptor란?
👉🏻 DispatcherServlet과 Controller 사이에서 해당 Controlelr가 실행되기 전 혹은 실행된 후에 요청을 낚아채서 실행할 내용을 작성 가능
👉🏻 Spring에서만 사용 가능함
👉🏻 주요 쓰임새: 로그인 여부 판별, 권한/직급 체크
Interceptor와 Filter의 차이점
👉🏻 존재 시점의 차이
✔️ Filter : Servlet에서 발생한 개념
요청이 Servlet에 도달하기 전에 가로채서 선처리하는 시점
✔️ Interceptor : Spring에서 발생한 개념
요청이 Controller의 메소드에 도달하기 전에 가로채서 선처리 또는 후처리하는 시점
요청의 흐름
사용자 👉🏻 View 👉🏻 "Filter"👉🏻 DispatcherServlet 👉🏻 "Interceptor" 👉🏻 Controller
Interceptor 클래스 작성 방법
👉🏻 HanlderInterceptorAdapter 클래스를 상속받아 구현
👉🏻 만들어진 Interceptor 클래스는 요청 전 해당 Interceptor를 거쳐갈 수 있게끔 servelt-context.xml 파일(요청과 관련된 설정을 기술)에 등록함
⌨️ 기본 구조 확인용
public class LoginInterceptor extends HandlerInterceptorAdapter {
}
Interceptor 메소드 종류 (오버라이딩하여 사용)
✔️ boolean 리턴 👉🏻 true / false
✔️ true 리턴했을 시 : 기존 요청 흐름대로 해당 Controller가 제대로 실행
✔️ false 리턴했을 시: Controller가 실행되지 않음
1️⃣ preHandle (선처리 구문 작성)
DispatcherServlet에서 컨트롤러를 호출하기 전에 낚아채는 영역
⌨️ 기본 구조 확인용
👉🏻 이미 정의되어 있는 HttpServletRequest, HttpServletResponse, Object를 이용함
👉🏻 선배 개발자가 preHandle 메소드 사용할 때 같이 쓰라고 넘겨 줌
👉🏻 어떤 예외가 발생하더라도 DispatcherServlet으로 떠넘김
public class LoginInterceptor extends HandlerInterceptorAdapter {
// 선처리용 preHandle 메소드 오버라이딩
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
}
2️⃣ postHandle (후처리 구문 작성)
컨트롤러에서 요청 처리 후 DispatcherServlet으로 뷰 정보가 리턴되는 순간에 낚아채는 영역
💻 Servlet-context.xml
👉🏻 내가 만든 해당 인터셉트를 요청url에 가기 전에 거쳐가게 해 줄래요!
👉🏻 1개의 interceptors당 mapping값 여러 개 지정 가능함
<interceptors>
<interceptor>
<mapping path="요청url맵핑값" />
<mapping path="요청url맵핑값" />
<mapping path="요청url맵핑값" />
...
<beans:bean class="내가만든인터셉터풀클래스명" id="객체명" /> <!-- 클래스 타입을 객체로 쓰겠다라고 빈을 등록 -->
</interceptor>
</interceptors>
📖 로그인 처리 기능으로 활용하는 법