배경

  • 팀 코드에 OpenPerRequestFilter를 상속한 형태의 Filter가 존재했다. 이 클래스는 어떤 역할인지 확인할 필요가 있었다.

필요한 상황

  • Filter는 서블릿 실행 전과 후에 호출된다.
  • 요청이 서블릿으로 들어오면 서블릿은 다른 서블릿으로 포워딩 할 수도 있다.
  • 이 과정에서 같은 필터를 여러 번 호출할 수도 있다.
  • Spring은 이런 상황에서 필터가 한번만 호출되는 것을 보장시켜주기 위해 OncePerRequestFilter을 제공한다.

사용법

  • OncePerRequestFilter를 상속한 클래스를 정의하고, doFilterINternal() 메소드를 override하면 된다.
public class AuthenticationFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain) throws
            ServletException, IOException {
        String usrName = request.getHeader(userName);
        logger.info("Successfully authenticated user  " +
                userName);
        filterChain.doFilter(request, response);
    }
}

참고 자료