* filter : 프레임워크에서 클라이언트에게 오는 요청 /응답의 최전방에 있는 web Application에서 관리되는 영역
ㄴ 이를 통해 요청 /응답의 정보를 변경하거나 spring에 의해 객체 등으로 변환되기 전의 순수한 request, response를 얻을 수 있다.
ㄴ 유일하게 ServletRequest, ServletResponse의 객체를 변환할 수 있다.
ㄴ 스프링에서는 주로 req/resp의 logging이나 인증에 관한 logic을 여기서 처리한다
- user
@Data //getter,setter,toString, 그외(equals,hashCode)등을 자동 생성해주는 롬복~
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
}
-controller
@Slf4j //log를 찍기 위함, 이제 system.out.println은 안녕~~
@RestController
@RequestMapping("/api")
public class ApiController {
@PostMapping("/user")
public User post(@RequestBody User user){
log.info("User : {}",user); //{}안에 user가 들어가는 것.(sytem + 했던 과거는 안녕~)
return user;
}
@PostMapping("/temp")
public User temp(@RequestBody User user){
log.info("User : {}",user); //{}안에 user가 들어가는 것.(sytem + 했던 과거는 안녕~)
return user;
}
}
- Globalfilter
@Slf4j
@WebFilter(urlPatterns = "/api/user/*") //특정 컨트롤러 주소에만 filter를 적용하기 위함
public class GlobalFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
ContentCachingRequestWrapper cachingRequestWrapper=new ContentCachingRequestWrapper((HttpServletRequest) request);
ContentCachingResponseWrapper cachingResponseWrapper=new ContentCachingResponseWrapper((HttpServletResponse) response);
//↑전처리지만 아직 리퀘스트 가지고 뭘 할순 없음(길이만큼 공간만 할당된 상태이기 때문)
chain.doFilter(cachingRequestWrapper,cachingResponseWrapper); //컨트롤러에서 처리를 마친 상태
//후처리
String url=cachingRequestWrapper.getRequestURI();
String reqBody=new String(cachingRequestWrapper.getContentAsByteArray());
log.info("request url: {}, request body : {}",url,reqBody);
int status= cachingResponseWrapper.getStatus(); //200,400 ...
String respBody=new String(cachingResponseWrapper.getContentAsByteArray()); //string으로 안감싸주면 웬 숫자들 나옴;
cachingResponseWrapper.copyBodyToResponse(); //컨트롤러가 응답으로 객체를 잘 보낼 수 있도록 처음 값을 복사.
log.info("response status: {}, response body : {}",status,respBody);
//위에서 응답을 다 처리하고 끝을 가리키기 때문에 이거 안해주면 클라이언트에게 응답body로 no-content
}
}
+) springbootApplication
@ServletComponentScan //특정 컨트롤러 주소에만 filter를 적용하기 위함
@SpringBootApplication
public class FilterApplication {
….
}
'BackEnd > 패캠' 카테고리의 다른 글
Rest Template (Server to Server 통신) (0) | 2022.01.25 |
---|---|
Intercepter (0) | 2022.01.24 |
Exception 처리 (0) | 2022.01.22 |
Validation (0) | 2022.01.21 |
AOP 실무 사례 알아보기 (0) | 2022.01.20 |
Comment