doFilter() 메서드

moon.kick·2025년 4월 17일

좋아! 네가 올려준 코드는 서블릿 필터(Filter)의 핵심 구조doFilter() 메서드야.
여기서 필터가 어떻게 요청(request)과 응답(response) 을 가로채고 처리하는지를 보여줘.
자세한 주석을 포함해서 아래에 완전한 템플릿 형태로 정리해줄게.


doFilter() 메서드 구조 설명 예시

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

    // 1️⃣ 사전 처리 (요청 전)
    System.out.println("[Filter] 요청이 들어오기 전에 처리할 로직");

    // 🔄 다음 필터 또는 서블릿으로 요청을 전달 (이 줄이 없으면 요청이 끊김)
    chain.doFilter(request, response);

    // 2️⃣ 사후 처리 (응답 후)
    System.out.println("[Filter] 응답을 클라이언트에 보내기 전에 처리할 로직");
}

✅ 활용 예시 ①: 인코딩 필터

@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 요청과 응답 문자셋 설정
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

        chain.doFilter(request, response); // 다음으로 넘김
    }
}

✅ 활용 예시 ②: 요청 시간 측정 필터

@WebFilter("/*")
public class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        long startTime = System.currentTimeMillis();

        // 요청 전달
        chain.doFilter(request, response);

        long endTime = System.currentTimeMillis();
        System.out.println("요청 처리 시간: " + (endTime - startTime) + "ms");
    }
}

✅ 주의할 점

항목설명
chain.doFilter()호출하지 않으면 요청이 다음 단계(다른 필터 또는 서블릿)로 전달되지 않음
사전/사후 처리 위치chain.doFilter() 이전 = 요청 전, 이후 = 응답 직전

필요하면 이걸 JWT 필터로 확장하거나
응답 본문 조작 (wrapper) 도 해줄 수 있어.

계속 도와줄까? 😊

profile
@mgkick

0개의 댓글