Spring

Spring Filter

HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 코드이며, 서블릿 2.3 규약에 새롭게 추가되었다. 필터는 객체의 형태로 존재하며 클라이언트로부터 오는 요청(request)과 최종자원(서블릿/JSP/기타 문서) 사이에 위치하며 클라이언트의 요청 정보를 알맞게 변경할 수 있으며, 또한 필터는 최종 자원과 클라이언트로 가는 응답(response) 사이에 위치하여 최종 자원의 요청 결과를 알맞게 변경할 수 있다.

 

 

이러한 필터는 인코딩, CORS, XSS, LOG, 인증, 권한 등 을 구현하는데 사용합니다.

스프링 시큐리티, 네이버의 lucy-xss-servelt-fiter 등이 대표적이 예입니다.

 

필터는 여러개 를 등록하고 요청이 해당 필터를 순서대로 통과하도록 할수 있습니다. 이런 필터들을 필터 체인이라고 부르죠.

스프링부트에서 필터를 등록하는 방법

우선  Filter인터페이스를 상속 받아서 구현

public class FirstFilter implements Filter {
	 @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        ...
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ...
    }

    @Override
    public void destroy() {
        ...
    }
}
  • init()
    • 필터가 생설될 때 수행되는 메서드
    • 웹 컨테이너(톰캣)이 시작될 때 필터 최초 한 번 인스턴스 생성
  • doFilter()
    • 클라이언트의 Request, Response가 필터를 거칠때 수행되는 메서드
    • FilterChain을 통해 전달
  • public void destroy()
    • 필터 인스턴스가 제거될 때 실행되는 메서드, 종료하는 기능

필터를 등록하는 방법(web.xml 등 xml 기반 등록은 제외)

1. FilterRegistrationBean으로 필터 등록

- 필터들 사이의 순서를 지정가능

- 각종 설정을 쉽게 설정가능

- 필터들의 설정을 하나의 configuration에 몰아서 관리할 수 있음

 

2. @WebFilter 애너테이션 필터 등록

- @WebFilter 어노테이션은 필터들 사이의 순서를 지정할 수 있는 속성은 제공하지않음

- @WebFilter 어노테이션을 적고 스캔하면 따로 관리하지않아도 스프링 ioc가 알아서 적용

- 어노테이션에 맵핑 URL을 입력하는 방법

1. 어노테이션에 맵핑 URL을 입력하는 방법
@WebFilter("/target") 

2. 어노테이션에 와일드카드를 사용하여 입력하는 방법 
@WebFilter("/*") 

3. 어노테이션의 value 속성을 이용하는 방법 
@WebFilter(value="/target") 
@WebFilter(value= {"/target", "/target2"})//여러개 등록시

4. 어노테이션의 urlPatterns 속성을 이용하는 방법 
@WebFilter(urlPatterns="/target") 
@WebFilter(urlPatterns= {"/target", "/target2"}) //여러개 등록시

5. 서블릿 등록시 사용한 서블릿 이름을 기준으로 지정하는 방법
@WebFilter(servletNames="boardController") 
@WebFilter(servletNames= {"boardController", "boardController2"}) //여러개 등록시

3. @Component, @Order(n)

Filter를 상속받은 class를 component로 등록하고 @Order로 순서를 설정하는 방식으로

간단하게 설정과 필터 적용이 가능하지만 다양한 설정이 어려움

실습

1. FilterRegistrationBean을 이용한 필터 등록 실습

1) CustomFilter를 하나 만들기

(import 까지 보여드리는 이유는 implement할때 Filter 가 여러개 떠서 헷갈리실거 같아서 입니다.)

2) 필터 등록

서버를 실행하면 실행 단계에서 init을 볼수 있고

주소로 접속시 필터를 타는 것을 확인할 수 있습니다.

 

2. @WebFilter 애너테이션 필터 등록

1) Custom2Filter 를 하나 만들기

필터를 하나 만들고 @WebFilter애너테이션을 적용하겠습니다.

빨간색부분과 log의 Custom2Filter 빼고는 이전 CustomFilter와 다를게 없습니다.

2) @ServletComponetScan 적용

configuration에 @ServletComponetScan 을 적용합니다.

 

서버를 실행하면 실행 단계에서 init과

요청했을때 필터 log를 확인할 수 있습니다.

 

3. @Component, @Order(n)

springboot의 기본 scan범위 안에 있다면 자동으로 등록되서 필터가 적용 된다.

order 어노테이션으로 필터 적용 순서를 정할수 있다.

3가지 모두를 적용한 경우의 순서

 

Reference

gardeny.tistory.com/35

'Spring' 카테고리의 다른 글

springboot에서 redis 다루기  (0) 2021.05.23
Spring Interceptor  (0) 2021.04.12
Spring AOP  (0) 2021.04.09
Spring Filter, Interceptor, AOP 비교  (0) 2021.04.09
Spring 요청의 흐름(Spring MVC 패턴)  (0) 2021.04.09