개발 공부

java servlet filter 본문

웹개발 (자바, 스프링, React)/자바 개념

java servlet filter

아이셩짱셩 2018. 9. 12. 10:40

#Interceptor vs. Filter

interceptor - 모든 request에 (framework request handling)

filter - 지정한 url에 (모든 url을 설정할 수도 있음) (servlet API)


#Serlvet Filter의 흐름

servlet-filter


#필터의 역할

필터 사용의 가장 큰 이득은 반복적인 작업을 재사용 가능한 단위로 캡슐화 할 수 있는 것입니다.

 

필터를 사용하여 다음과 같이 다양한 형태의 기능들을 수행할 수 있습니다.

  • 사용자 정보를 근거로 요청 인증 및 요청 차단
  • 웹 어플리케이션의 유저 작업 추적(로깅 및 감사)
  • Data compression
  • Localization
  • XLST 를 사용하여 XML 데이터의 변형
  • Encryption
  • mime-type 변경
  • Caching


#Filter API 구성

  • javax.servlet.Filter Interface
    filter 는 Filter 인터페이스를 구현하는 것으로서 정의됩니다.
  • javax.servlet.FilterChain Interface
    filter chain 은 필터 통과 및 필터 시리즈를 호출하기 위한 수단을 제공합니다.
  • javax.servlet.FilterConfig Interface
    filter config 는 초기화 데이터를 가지고 있습니다.


#Filter 인터페이스 (javax.servlet.Filter Interface)

public void init(FilterConfig filterConfig) throws ServletException;

필터를 웹 콘테이너내에 생성한 후 초기화할 때 호출한다.


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException;

체인을 따라 다음에 존재하는 필터로 이동한다. 체인의 가장 마지막에는 클라이언트가 요청한 최종 자원이 위치한다.


public void destroy();

필터가 웹 콘테이너에서 삭제될 때 호출된다.


#doFilter() 메서드 내에서 이루어지는 작업의 순서

1) request 파라미터를 이용하여 클라이언트의 요청 필터링: 1단계에서는 RequestWrapper 클래스를 사용하여 클라이언트의 요청을 변경한다.
2) chain.doFiter() 메서드 호출: 2단계에서는 요청의 필터링 결과를 다음 필터에 전달한다.
3) response 파라미터를 사용하여 클라이언트로 가는 응답 필터링: 3단계에서는 체인을 통해서 전달된 응답 데이터를 변경하여 그 결과를 클라이언트에 전송한다.

#FilterConfig가 제공하는 메서드
*web.xml에서 설정해주는 filter tag의 값을 불러오는 역할(?)
String getFilterName();
설정파일에서<filter-name>에서 지정한 필터의 이름을 리턴한다.

String getinitParameter(String name);
설정파일의 <init-param>에서 지정한 초기화 파라미터의 값을 읽어온다. 존재하지 않을 경우 null을 리턴한다.
<filter><init-param><param-name/><param-value/></init-param></filter>
Enumeration<String> getInitParameterNames();
초기화 파라미터의 이름 목록을 구한다.

ServletContext getServletContext();
서블릿 컨텍스트 객체를 구한다.



#ServletWrapperClass
필터가 필터로서의 제기능을 하기 위해서는 클라이언트의 요청을 변경하고, 또한 클라이언트로 가는 응답을 변경할 수 있어야 할 것이다. 이러한 변경을 할 수 있도록 해 주는 것이 바로 ServletRequestWrapper와 ServletResponseWrapper이다. 서블릿 요청/응답 래퍼 클래스를 이용함으로써 클라이언트의 요청 정보를 변경하여 최종 자원인 서블릿/JSP/HTML/기타 자원에 전달할 수 있고, 또한 최종 자원으로부터의 응답 결과를 변경하여 새로운 응답 정보를 클라이언트에 보낼 수 있게 된다.

서블릿 요청/응답 래퍼 클래스로서의 역할을 수행하기 위해서는 javax.servlet 패키지에 정의되어 있는 ServletRequestWrapper 클래스와 ServletResponseWrapper 클래스를 상속받으면 된다. 하지만, 대부분의 경우 HTTP 프로토콜에 대한 요청/응답을 필터링 하기 때문에 이 두 클래스를 상속받아 알맞게 구현한 HttpServletRequestWrapper 클래스와 HttpServletResponseWrapper 클래스를 상속받는 경우가 대부분일 것이다.

HttpServletRequestWrapper 클래스와 HttpServletResponseWrapper 클래스는 모두 javax.servlet.http 패키지에 정의되어 있으며, 이 두 클래스는 각각 HttpServletRequest 인터페이스와 HttpServletResponse 인터페이스에 정의되어 있는 모든 메소드를 이미 구현해 놓고 있다. 필터를 통해서 변경하고 싶은 정보가 있을 경우 그 정보를 추출하는 메소드를 알맞게 오버라이딩하여 필터의 doFilter() 메소드에 넘겨주기만 하면 된다. 예를 들어, 클라이언트가 전송한 "company" 파리머터의 값을 무조건 "JavaCan.com"으로 변경하는 요청 래퍼 클래스는 다음과 같이 HttpServletRequestWrapper 클래스를 상속받은 후에 getParameter() 메소드를 알맞게 구현하면 된다.


#출처: 

http://devbox.tistory.com/entry/Servlet-서블릿-필터와-이벤트-1 [장인개발자를 꿈꾸는 :: 기록하는 공간]
http://stevenjsmin.tistory.com/8 [Steven J.S Min's Blog]

Comments