본문 바로가기

Programming/Servlet

DAY 113. 서블릿 필터, 서블릿 래퍼

 

 

서블릿 필터와 래퍼 동작 구조

 

 

 

01. 서블릿 필터

 

Filter

- Servlet 이나 요청하는 자원 앞에 위치하면서 , 요청이나 응답을 가로채서 데이터를 변경하거나 특정 기능을 수행할 수 있게 해주는 객체이다.

- 주로 암/복호화, 인코딩 작업 등을 할 때 사용한다.

- javax.servlet.Filter 인터페이스를 상속 받아서 구현한다.

 

  • 요청을 필터로 보내서 필요한 작업을 수행한다. 데이터를 가공하거나, 잘못된 요청은 서블릿으로 전달하지 않거나 한다.
  • 가공된 데이터를 서블릿 객체로 전달되면 작업을 수행하고 다시 필터로 받아서 응답에 대해서도 처리해야 할 작업이 있으면 해주고 나서 사용자에게 응답하게 된다.
  • Request는 보안 관련, 요청 헤더와 바디 형식 지정, 요청에 대한 log 기록 유지
  • Response : 응답 스트림 압축, 응답 스트림 내용 추가 및 수정, 새로운 응답 작성 등 처리

 

Wrapper

- Request나 Response 객체는 한 번 생성되면 임의로 데이터를 변경할 수가 없다. 이 것을 상황에 따라 데이터를 변경해야 하는 경우라면 Wrapper로 Request 객체를 한 번 감싸서 데이터를 가공하는 역할을 한다.

 

 


 

Filter Interface

 

init(FilterConfig config)

필터 객체를 생성하며 초기화 한다.

 

doFilter(ServletRequest req, ServletResponse res, FilterChain chain)

필터 안에서 처리해야 하는 내용을 구현하는 것

필터 수행 시 사용하는 메소드

요청 객체와 응답 객체를 사용해 작업을 수행한 후, chain을 통해 가공된 값을 목적지로 전송

 

destroy()

역할이 끝난 필터는 해당 메소드를 호출하며 소멸한다.

 

 

 

interface FilterChain

- 필터는 chain처럼 서로 연결되어 있는데 연결되어 있는 필터를 순차적으로 doFilter() 메소드로 실행시키는 인터페이스이다.

- 마지막 필터가 실행된 후, service() 메소드를 실행하여 서블릿의 메소드의 doGet(), doPost()를 실행한다.

 

 


 

02. 서블릿 래퍼

- 필터 클래스로부터 전달받은 데이터를 다시 가공하여 필터에게 반환하는 클래스

- request, response의 데이터는 함부로 변조할 수 없다. 그러나 필요에 의해서 가공해야 되는 일이 생길 때, 직접 수정하는 것이 아니라 Wrapper로 한 번 감싼 후, 수정하게 된다.

- 데이터 가공이 필요한 시점일 경우 요청 객체에 대한 가공이라면 HttpServletRequestWrapper 클래스를 통해 구현하고, 응답 객체라면 HttpServletResponseWrapper 클래스를 통해서 구현한다.

- 원본 데이터는 수정되지 않는다.