[Servlet/JSP] 필터(Filter) (0730)

왕감자·2024년 7월 30일

KB IT's Your Life

목록 보기
107/177

필터

클라이언트와 서버 사이에서 request와 response 객체를 먼저 받아 사전/사후 작업 등 공통적으로 필요한 부분 처리
ex) 문자셋 설정, 예외 처리, 보안 ···

✅ 단일책임의 원칙에 따라 한 가지 작업만 처리
✅ 다수의 필터를 체인으로 연결 가능


  • Request 필터
    • 인증 (사용자 인증)
    • 요청 정보를 로그 파일로 작성
    • 암호화 인코딩 작업
  • Response 필터
    • 응답 결과 데이터 압축
    • 응답 결과에 내용 추가/수정
    • 총 서비스 시간 측정

* 필터 인터페이스

🔸 필터 인터페이스 메소드

  • init() : 초기화
  • doFilter() : 필터 기능
  • destroy() : 인스턴스 종료 전 호출

* doFilter()

public void doFilter(ServletRequest request, ServletResponse response,
					 FilterChain chain) throws IOException, ServletException
  • request, response : Servlet-doGet의 매개변수로 전달
  • chain : 다음 필터 호출

🔸 필터 등록

  • @WebFilter 어노테이션 이용
    • 필터 순서 지정X - 순서 지정하려면 web.xml 사용해야 함
@Webfilter(urlPatterns={"/*"})
public class CharacterEncodeFilter implements Filter { ...

🔸 CharacterEncodingFilter

  • 모든 요청에 대한 요청 문자셋 설정 - Servlet에서 개별적으로 설정 안 해도 됨
  • 항상 만들어야 함
  • 가장 먼저 작업
//CharacterEncodeFilter
//Servlet -> request.setCharacterEncoding() 제거
@WebFilter(urlPatterns = {"/*"})
public class CharacterEncodeFilter implements Filter {
    @Override
    public void init(FilterConfig fConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8"); //전처리
        chain.doFilter(request, response);
    }
}

🔸 PerformanceFilter

  • 수행 시간, 요청 처리 시간 체크 필터 - 성능 모니터링
@WebFilter(urlPatterns = {"/*"})
public class PerfomanceFilter implements Filter {
    ...
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        chain.doFilter(request, response);
        long end = System.currentTimeMillis();

        // Servlet은 HttpServletRequest , Filter는 ServletRequest -> 인스턴스는 같음
        // 경로는 HttpServletRequest에서 알 수 있음 => 캐스팅해야 함
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        System.out.println(
                httpRequest.getMethod() + ": " +
                httpRequest.getRequestURI() + " 실행시간: " + (end - start));
    }
}

// GET: /sports.jsp 실행시간: 556

뒤로가기, 앞으로가기 했을 땐 필터 적용X ⇨ 뒤로가기는 요청이 아니다, 캐시에서 복원

0개의 댓글