Filter, Interceptor - 1/ 패스트캠퍼스 챌린지 03일차

망고쥬스·2021년 11월 3일
0

Filter란?

웹 어플리케이션에서 관리되는 영역, 클라이언트에서 오는 요청 혹은 응답값의 처음,마지막 단계에서 작동하며 필터를 통해 정보를 변경하거나 정보 변경 전 클라이언트에서 요청 혹은 응답값을 확인할 수 있다.

  • 유일하게 ServletRequest와 ServletResponse의 객체를 변환할 수 있다.

  • 주로 스프링에서는 Request, Response의 Logging용도로 활용 혹은 인증과 관련된 로직들을 Filter에서 처리하게 된다.

  • Service Business Logic과 분리해 선/후 처리를 하게 되는 역할


로직이 처리 될 때 Filter가 최 우선적으로 처리되며 Interceptor는 후 순위

DTO를 생성 (User.java)

package com.example.filter.dto;

import lombok.*;

@Data
public class User {

    private String name;
    private int age;

}

Controller를 생성 (ApiController.java)

@Slf4j //sout을 사용하는게 아닌 log를 사용할 수 있게 해준다.
@RestController
@RequestMapping("api/user")
public class ApiController {

    @PostMapping("")
    public User user(@RequestBody User user){
        log.info("User: {}", user); 
        // User: {}, {} 는 뒤에 따라오는 객체와 매칭
        return user;
    }
}

Filter 생성 (GlobalFilter.java)

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

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3FVdhDa

profile
#newbieDeveloper #since 2021.04.06

0개의 댓글