인프런 커뮤니티 질문&답변

kdh906님의 프로필 이미지
kdh906

작성한 질문수

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Spring Cloud Gateway - Global Filter

filter에서 response body를 수정해서 client에 리턴하고 싶은데요.

작성

·

1.4K

0

response.getBody() 뭐 이런식의 메서드가 없어서요...

getHeader()는 있는데....

 

body의 특정 문자열을 바꿔서 리턴하고자 해서 문의 해봅니다.

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

filter에서 수정한 response body를 client에게 리턴하고 싶으시다면, responseBody를 직접 수정하시면 됩니다.

responseBody 문자열을 바꾸기 위해서는 response 문자열을 가져와서 수정한 후에, response 객체에 setting을 해주시면 됩니다.

아래는 예시 코드입니다.

@Component
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;

        ContentCachingResponseWrapper responseWrapper =new ContentCachingResponseWrapper((HttpServletResponse) response);

        // chain의 doFilter 호출을 통해 request, response 객체를 전달합니다.
        chain.doFilter(req, responseWrapper)

        String responseBody = new String(responseWrapper.getContentAsByteArray(), responseWrapper.getCharacterEncoding());
        responseBody = responseBody.replaceAll("originalString", "changedString");

        // responseWrapper 객체의 내용을 responseBody로 업데이트합니다.
        responseWrapper.copyBodyToResponse();

    }
}

위 예시 코드에서는 ContentCachingResponseWrapper를 이용하여 responseWrapper 객체를 초기화합니다. 그리고 chain.doFilter()를 호출하여 request와 responseWrapper 객체를 전달합니다.

그 다음, responseWrapper.getContentAsByteArray() 메소드를 호출하여 ContentCachingResponseWrapper 내용의 byte array를 가져옵니다. 그리고 이 값을 String 객체로 변환한 후에, 수정한 후 반환할 문자열을 수정하면 됩니다.

수정이 완료되면 responseWrapper.copyBodyToResponse() 메서드를 호출하여 수정된 responseBody로 response 객체를 업데이트하면 됩니다.

이렇게 하면 filter를 이용한 response body 수정이 가능합니다.

감사합니다.

kdh906님의 프로필 이미지
kdh906

작성한 질문수

질문하기