WEB | Servlet - Filter & Wrapper

바다·2023년 6월 8일
0

WEB

목록 보기
5/9
post-thumbnail

Servlet Filter

Servlet Filter란?

  • javax.servlet.Filter Interface를 상속 받아 구현하는 'Class'이다.
  • HTTP 요청과 응답 사이에서 전달되는 데이터를 가로채어, 서비스에 맞게 변경하고 걸러내는 필터링 작업을 한다.
  • 'HTTP 요청과 응답을 변경할 수 있는 재사용가능한 코드'이다.
  • 필터는 객체의 형태로 존재하며 클라이언트로부터 오는 요청(request)과 최종 자원(서블릿/JSP/기타 문서) 사이에 위치하여 클라이언트의 요청 정보를 알맞게 변경할 수 있으며, 또한 필터는 최종 자원과 클라이언트로 가는 응답(response) 사이에 위치하여 최종 자원의 요청 결과를 알맞게 변경할 수 있다.
  • 필터는 설정에 따라 해당하는 요청 및 응답 시에 반드시 거쳐야 하며, 비밀번호 암호화 처리, 인코딩 설정 등 공통 관리에 해당하는 기능을 수행할 수 있다.
  • init() 👉 dofilter() 👉 destroy()의 생명 주기를 가짐

Servlet Filter의 처리 내용

Request에 대한 처리

  • 보안 관련 사항
  • 요청 header와 body 형식 지정
  • 요청에 대한 log 기록 유지

Response에 대한 처리

  • 응답 Stream 압출
  • 응답 Stream 내용 추가 및 수정
  • 새로운 응답 작성

여러가지 필터를 연결(chain 기법)하여 사용

Servlet Filter 동작 구조


자원이 받게 되는 요청 정보는 클라이언트와 자원 사이에 존재하는 필터에 의해 변경된 요청 정보
또한, 클라이언트가 보게 되는 응답 정보는 클라이언트와 자원 사이에 존재하는 필터에 의해 변경된 응답 정보

Filter Chain

  • Filter를 여러 개 사용하는 경우, Filter Chain을 사용할 수 있다.
  • Chain처럼 서로 연결되어 있는 Filter를 doFilter() method를 이용하여 순차적으로 실행시키는 interface이다.
  • doFilter() : chain으로 연결되어 있는 다음 Filter를 실행하는 method이다.
doFilter(ServletRequest req, ServletResponse);
  • 마지막 필터가 실행된 후에는 service() method를 실행시켜 Servlet의 method(doGet(), doPost())를 실행한다.

Filter Interface

init(FilterConfig config)

  • 웹 컨테이너가 필터를 호출할 경우 해당 메소드가 호출되어 필터 객체를 생성하며 초기화한다.
  • 매개변수 FilterConfig는 web.xml에 있는 < filter > 정보를 가지고 있다.

doFilter(ServletRequest req, ServletResponse res, FilterChain chain)

  • 필터가 수행될 때 구동하는 메소드로, 요청 객체와 응답 객체를 사용해 일련의 작업을 수행한 뒤 chain을 통해 가공된 값을 목적지로 전송한다.

destroy()

  • 역할이 끝난 Filter는 웹 컨테이너에 의해 destroy method를 호출하고 소멸된다.
public class FilterClass implements Filter {
	@Override
    public void init(FilterConfig config) throws ServletException {
    (Filter 호출 시 작업 설정)
    }
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    (Filtering 작업할 내용)
    }
    
    @Override
    public void destroy() {
    (삭제 시 작업 설정)
    }
}

Servlet Filter사용

작성한 Filter class를 web.xml 파일에 작성해 주어야 한다.

1. Filter를 등록한다.

<filter>
  	<filter-name>Filter 설정명</filter-name>
  	<filter-class>Filter 구현 Classaud</filter-class>
  	<init-param> //필터에서 사용한 값 설정
      <param-name>초기값 설정명</param-name>
      <param-value>초기 설정값</param-value>
    </init-param>
</filter>

2. url 패턴과 Filter를 mapping 한다.

<filter-mapping>
  <filter-name>등록된 Filter명</filter-name>
  <url-pattern>요청할 페이지 형식</url-pattern>
</filter-mapping>

3. Filter를 적용할 Servlet을 지저하여, Servlet과 Filter를 mapping 한다.

<filter-mapping>
  <filter-name>등록된 Filter명</filter-name>
  <servlet-name>적용할 Servlet명</servlet-name>
</filter-mapping>
  • < filter >와 < filter-mapping > 은 항상 함께 쓰여야 한다.
  • filter-mapping 방식은 두 가지 이지만, "url-pattern"이 우선 적용된다.

Servlet Wrapper

Servlet Wrapper란?

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

  • 데이터 가공이 필요한 시점이 "요청"일 경우 👉 HttpServletRequestWrapper클래스를 통해 구현

  • 데이터 가공이 필요한 시점이 "응답"일 경우 👉 HttpServletResponseWrapper클래스를 통해 구현

  • 관련 클래스(ServletRequest, ServletResponse, HttpServletRequest, HTtpServletResponse)를 내부에 보관하며 그 Interface를 구현한 객체를 참조하여 구현 method를 위임한다.

  • java Event 처리의 Adapter Class와 비슷한 기능을 한다고 볼 수 있다.

  • 사용자가 별도의 request나 response 객체를 생성하여 활용할 때 Wrapper Class를 상속하여 활용하면, 편하게 원하는 Class만 재정의하여 사용 가능하다.

Servlet Wrapper 동작 구조

HttpServletRequestWrapper

  • 요청한 정보를 변경하는 Wrapper 클래스
  • HttpServletRequest 객체를 매개로 하는 생성자를 가진다
public SampleWrapper(HttpServletRequest wrapper) {
	super(wrapper);
}

HttpServletResponseWrapper

  • 응답할 정보를 변경하는 Wrapper 클래스
  • HttpServletResponse 객체를 매개로 하는 생성자를 가진다
public SampleWrapper(HttpServletResponse wrapper) {
	super(wrapper);
}
profile
ᴘʜɪʟɪᴘᴘɪᴀɴs 3:14

0개의 댓글