Spring - filter


Filter 란 ?

image

Spring은 Client로부터 request를 받고, response를 줄 때 Filter를 거쳐서 전달해준다.

Filter는 웹 어플리케이션에서 관리되는 영역으로, Spring에 의해서 데이터가 변환 되기 전, Client가 보낸 순수한 요청, 응답 값을 확인할 수 있다.


Filter의 사용

절차

  1. Filter를 사용하기 위해 Filter를 implements한 클래스를 생성한다.
  2. WebFilter 어노테이션을 추가하고, 적용범위를 설정한다.
    • default = 모든 url
  3. doFilter() 메서드를 오버라이드한다.
  4. SpringBootApplication 어노테이션이 추가된 메인부에 @ServletComponentScan을 추가해준다

doFilter() 메서드

메서드의 parameter로 FilterChain 타입의 chain을 받을 수 있다. chain.doFilter() 메서드를 기준으로 필터에 들어오기 전, 후를 구분할 수 있다.

< 전처리 >

다른 parameter 중 ServletRequest request, ServletResponse reponse가 들어온다.

위 Servlet 타입은 response, request를 단 1번만 사용할 수 있다. 들어온 요청을 log로 서버에 남기면 이를 다른 용도로 활용할 수 없는 것이다.

따라서 ContentCahchingRequestWrapper, ContentCachingResponseWrapper를 생성해준다.

  • 생성자의 인자로 ServletRequest과 ServletResponse를 사용할 수 있다.

< 후처리 >

서버에는 사용자가 보낸 내용과, 요청을 보낸 uri를 확인하기 위해 get메서드를 통해 로그로 남겨주었다.

응답으로 보내주는 httpStatus와 content 또한 저장하며 log에 기록해주었다.

1. TalentAPI를 통해 객체에 맞는 데이터를 post 해준다.

img_1.png

2. Post한 값과, uri가 log로 찍힌다.

img_2.png

3. Response 한 값과 HttpStatus가 알맞게 log에 찍히는 것을 확인할 수 있다.

img_4.png
img_3.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@WebFilter(urlPatterns = "/api/user/*")
public class GlobalFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 전처리
ContentCachingRequestWrapper contentCachingRequestWrapper = new ContentCachingRequestWrapper((HttpServletRequest) request);
ContentCachingResponseWrapper contentCachingResponseWrapper = new ContentCachingResponseWrapper((HttpServletResponse) response);

// 필터
chain.doFilter(contentCachingRequestWrapper, contentCachingResponseWrapper);

// 후처리
String reqContetnt = new String(contentCachingRequestWrapper.getContentAsByteArray());
String url = contentCachingRequestWrapper.getRequestURI();
log.info("url : {}, reqContent : {}", url, reqContetnt);

int httpStatus = contentCachingResponseWrapper.getStatus();
String content = new String(contentCachingResponseWrapper.getContentAsByteArray());
log.info("http status : {}, content : {}", httpStatus, content);

contentCachingResponseWrapper.copyBodyToResponse();


}
}
Author

Inwoo Jeong

Posted on

2021-10-26

Updated on

2021-10-28

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

댓글