Filter란?
웹 어플리케이션에서 관리되는 영역, 클라이언트에서 오는 요청 혹은 응답값의 처음,마지막 단계에서 작동하며 필터를 통해 정보를 변경하거나 정보 변경 전 클라이언트에서 요청 혹은 응답값을 확인할 수 있다.
유일하게 ServletRequest와 ServletResponse의 객체를 변환할 수 있다.
주로 스프링에서는 Request, Response의 Logging용도로 활용 혹은 인증과 관련된 로직들을 Filter에서 처리하게 된다.
Service Business Logic과 분리해 선/후 처리를 하게 되는 역할
package com.example.filter.dto;
import lombok.*;
@Data
public class User {
private String name;
private int age;
}
@Slf4j //sout을 사용하는게 아닌 log를 사용할 수 있게 해준다.
@RestController
@RequestMapping("api/user")
public class ApiController {
@PostMapping("")
public User user(@RequestBody User user){
log.info("User: {}", user);
// User: {}, {} 는 뒤에 따라오는 객체와 매칭
return user;
}
}
package com.example.filter.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
@Slf4j
@Component //bean에 등록
public class GlobalFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//pre-전처리
ContentCachingRequestWrapper httpServletRequest = new ContentCachingRequestWrapper ((HttpServletRequest) request);
ContentCachingResponseWrapper httpServletResponse = new ContentCachingResponseWrapper ((HttpServletResponse) response);
//HttpServeletRequest, Response의 경우 한번 읽어버리면 데이터를 다시 가져오지 못하게 된다.
// └ (java.lang.IllegalStateException: getReader() has already been called for this request)
//ContentCachingRequestWrapper,Response를 이용하게 되면 캐싱처리가 되서 몇번이든 다시 읽을 수 있게 된다.
String url = httpServletRequest.getRequestURI();
chain.doFilter(httpServletRequest, httpServletResponse);
//post -후처리
//req
String content = new String (httpServletRequest.getContentAsByteArray()); //default=utf8
log.info("request url: {}, request body: {}", url, content);
String resContent = new String (httpServletResponse.getContentAsByteArray());
int httpStatusCode = httpServletResponse.getStatus();
log.info("response status : {}. response body:{}", httpStatusCode, resContent);
}
}
httpServletResponse.copyBodyToResponse();
//body로 결과값을 리턴해준다. echo
요청값
{
"name" : "steve",
"age" : 10
}
결과값(Console)
#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는Java/Spring웹개발마스터초격차패키지Online
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.