Interceptor

최지홍·2022년 4월 20일
0

매일 공부

목록 보기
34/40

Interceptor

  • Controller에 들어오는 request와 response를 가로채는 역할
  • 관리자 인증을 하는 용도로 사용할 수 있음
  • 서블릿의 앞, 뒤에서 request와 response를 가로채는 filter와 역할이 유사

Filter vs Interceptor

  • 호출 시점
    • Filter: DispatcherServlet이 실행되기 전
    • Interceptor: DispatcherServlet이 실행된 후
  • 설정 위치
    • Filter: web.xml
    • Interceptor: spring-servlet.xml
  • 구현 방식
    • Filter: web.xml 입력
    • Interceptor: 메서드 구현 필요

Interceptor의 구현

  • HandlerInterceptor 인터페이스 구현
    • preHandle(): 컨트롤러가 호출되기 전 실행. obj 파라미터는 컨트롤러의 메서드를 참조 할 수 있는 HandlerMethod 객체
    • postHandle(): 컨트롤러가 실행된 후 호출
    • afterComplete(): 뷰에서 최종 결과가 생성하는 일을 포함한 모든 일이 완료 되었을 때 실행
    • 각 메서드의 반환값이 true이면 핸들러의 다음 체인이 실행되지만, false일 경우 남은 인터셉터와 컨트롤러가 실행되지 않음
  • HandlerInterceptorAdapter 클래스 상속
/*
 * Copyright 2002-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;

public interface HandlerInterceptor {

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return true;
	}

	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}

	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}

}

Filter, Interceptor, AOP

  • Interceptor와 Filter: Servlet 단위에서 실행
  • AOP: Proxy 패턴의 형태

Filter

  • 요청과 응답을 필터링
  • 자원의 앞단에 위치하여 여러가지 체크 가능
  • 처리가 끝난 후 응답 내용에 대해서도 변경하는 처리 가능
  • 인코딩 터리, XSS 방어 등의 처리로 사용
<filter>
	<filter-name>encoding</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>encoding</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
  • 패턴을 /*로 지정하면 servlet, jsp 뿐 아니라 이미지와 같은 모든 자원의 요청에도 호출됨
  • init(): 필터 인스턴스 초기화
  • doFilter(): 전/후 처리
  • destroy(): 필터 인스턴스 종료

Interceptor

  • 요청에 대한 작업 전/후로 가로챔
  • 필터는 스프링 컨텍스트 외부에 존재. 스프링과 무관한 자원에 대해 동작
  • 인터셉터는 스프링 컨텍스트 내부에서 컨트롤러에 대한 요청과 응답 처리
  • 모든 스프링 빈 객체에 접근 가능
  • 여러 개 사용 가능

AOP

  • OOP를 보완하기 위한 개념
  • 인터셉터와 필터와 달리 메서드 전후의 지점에 자유롭게 설정 가능
  • 인터셉터와 필터는 주소로 대상을 구분해서 걸러내는 반면, AOP는 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상 지정 가능
  • AOP는 파라미터가 JoinPoint나 ProceedingJoinPoint
  • 인터셉터는 HttpServletRequest, HttpServletResponse를 파라미터로 사용

url mapping

  • /: 루트
  • /*: 바로 아래 단계 하위 경로까지
  • /**: 모든 하위 경로
profile
백엔드 개발자가 되자!

0개의 댓글