2024. 5. 14. 16:22ㆍ스프링부트
필터
필터 적용시키기
1. Filter를 implements하는 필터 클래스를 구현
2. FilterRegistrationBean에 필터를 넣어 생성
3. FilterRegistrationBean에 필터링할 URL 패턴 혹은 순서를 set한다.
필터 인터페이스는 3가지 메소드를 정의한다.
1. init
2. doFilter
3. destroy
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{
//todo
filterChain.doFilter(servletRequest, servletResponse);
}
해당 부분이 매우 중요한데
filterChain.doFilter를 통해 다음 필터, 혹은 컨트롤러의 메소드로 이동한다.
이때 request와 response를 넘겨줘야한다.
request 헤더에 토큰을 추가하거나 body로 온 이미지를 압축하여 다시 넣어주는 등의 로직을 할 수 있다.
또 dofilter가 끝난 후 response를 조작할 수도 있다.
여러 필터가 동작 과정
필터 1 시작 -> 필터 2 시작 -> 컨트롤러 동작 -> 필터2 끝 -> 필터 1 끝
동작과정을 생각하며 request와 response를 제어하자.
필터 종류
OncePerRequestFilter로 요청을 한번만 처리하는게 어떠한 의미인지 위의 포스팅에 적절한 예시가 나와있다.
필터의 예외처리
필터는 디스패처 서블릿 전에 동작하는데 @ControllerAdvice, @ExceptionHandler 는 이를 잡아내지 못한다.
따라서 필터 내부에서 예외처리를 해야한다.
인터셉터
인터셉터 적용시키기
1. HandlerInterceptor를 implements하는 인터셉터 클래스를 구현
2. InterceptorRegistry에 커스텀 인터셉터를 넣어 생성
3. InterceptorRegistry에 필터링할 URL 패턴 혹은 순서를 set한다.
인터셉터같은 경우 fillterChain.doFillter로 다음 필터 혹은 컨트롤러로 넘어간 필터와 다르게 override한 함수의 반환값을 통해
순서를 제어한다.
true인 경우 다음 인터셉터 혹은 컨트롤러를 실행한다.
여기서 중요한점이 HttpServletRequest에서 body는 한번 읽으면 뒤에 읽을 수 없다. 레퍼나 여러 방식을 이용해 수정할 수 있다. 하지만
직접적인 수정은 뒤에 예기치않은 결과를 만들 수 있다.
HttpServletRequest 참고
'스프링부트' 카테고리의 다른 글
스프링 시큐리티 필터 (0) | 2024.05.15 |
---|---|
스프링 Aop (0) | 2024.05.14 |
스프링 intellij 디버깅 (0) | 2024.05.14 |
스프링 Process 617 is still running (0) | 2024.05.14 |
스프링부트 스웨거3 (1) | 2024.05.01 |