JSP 필터

박승현·2022년 5월 4일

JSP

목록 보기
11/11

필터의 개요

필어는 클라이언트와 서버 사이에서 request와 response 객체를 먼저 받아 사전/사후 작업 등 공통적으로 필요한 부분을 처리하는 것을 말한다. 필터는 클라이언트의 요청이 웹 서버의 서블릿, JSP, HTML 페이지 같은 정적 리소스에 도달하기 전과, 반대로 정적 리소스에서 클라이언트로 응답하기 전에 필요한 전처리를 가능하게 한다.

필터는 HTTP 요청과 응답을 변경할 수 있는 코드로 재사용이 가능하다. 한편 클라이언트와 정적 리소스 사이에 여러 개의 필터로 이루어진 필터 체인을 제공하기도 한다.

이처럼 웹 애플리케이션에 필터 기능을 제공하기 위해 Filter 인터페이스를 구현하는 자바 클래스를 생성하고, 생성된 자바 클래스를 web.xml파일에 등록한다.

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

Filter 인터페이스의 구현 클래스

Filter 인터페이스는 필터 기능을 구현하는 데 핵심적인 역할을 한다. 클라이언트와 서버의 리소스 사시에 위치한 필터의 기능을 제공하기 위해 자바 클래스로 구현해야 한다. 자바 클래스로 구현할 때 패키지 javax.servlet.Filter를 임포트해야 한다.

import javax.servlet.Filter;

public class 클래스이름 implements Filter{

}

[Filter 인터페이스 메소드의 종류]

메소드설명
init()필터 인스턴스의 초기화 메소드이다.
doFilter()필터 기능을 작성하는 메소드이다.
destroy()필터 인스턴스의 종료 전에 호출되는 메소드이다.

init() 메소드

init() 메소드는 JSP 컨테이너가 필터를 초기화할 때 호출되는 메소드 이다. init() 메소드는 JSP 컨테이너 내에서 초기화 작업을 수행할 필터 인스턴스를 생성한 후 한번만 호출된다. init() 메소드는 JSP 컨테이너에 의해 호출되어 필터의 서비스가 시작되고 있음을 나타낸다.

public void init(FilterConfig filterConfig) throws ServletException

여기서 매개변수 FilterConfig 객체는 JSP 컨테이너가 초기화 중 필터에 정보를 전달하는 데 사용하는 필터 구성 객체이다.

[FilterConfig 인터페이스 메소드의 종류]

메소드반환유형설명
getFilterName()Stringweb.xml 파일에 설정된 필터 이름을 반환한다.
getInitParameter(String name)Stringweb.xml 파일에 설정된 매개변수에 대한 매개변수 값을 반환한다. 초기화 매개변수가 존재하지 않으면 null을 반환한다.
getInitParameterNames()Enumeration<String>web.xml 파일에 설정된 모든 매개변수 이름을 포함하는 Enumeration 객체 타입을 반환한다. 초기화 매개변수가 존재하지 않으면 비어 있는 Enumeration을 반환한다.
getServletContext()ServletContextServletContext 객체를 반환한다.

[init() 메소드 사용 예]

@Override
public void init(FilterConfig filterConfig) throws ServletException{
	System.out.println("필터 초기화...");
}

doFilter() 메소드

doFilter() 메소드는 JSP 컨테이너가 필터를 리소스에 적용할 때마다 호출되는 메소드이다. doFilter() 메소드는 init() 메소드 후에 호출되며, 필터가 어떤 기능을 수행할 필요가 있을 때마다 호출된다.

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

첫 번째 매개변수 ServletRequest 객체는 체인을 따라 전달하는 요청이고, 두 번째 매개변수 ServletResponse 객체는 체인을 따라 전달할 응답이다. 세 번째 매개변수 FilterChain 객체는 체인에서 다음 필터를 호출하는 데 사용되는데, 만약 호출 필터가 체인의 마지막 필터이면 체인의 끝에서 리소스를 호출한다.

필터는 연속된 체인을 따라 다음에 존재하는 필터로 이동하여 연속적으로 수행한다. 이때 수행해야 할 필터 객체는 doFilter() 메소드의 매개변수 FilterChain 객체로 전달된다. FilterChain 객체는 동기화를 위해서도 존재하지만 필터의 수행 과정을 연속적으로 하는 방법으로 사용된다. FilterChain 객체는 하나의 메소드만 지원한다.

FilterChain 인터페이스 메소드의 종류

메소드반환유형설명
doFilter(ServletRequest request, ServletResponse response)void체인의 다음 필터 또는 리소스로 제어를 전달한다.

다음은 doFilter() 메소드를 구현한 예이다. 필터는 한 번만 수행되는 것이 아니라 요청을 받았을 때 수행되고 filterChain.doFilter()를 통해 다음 부분으로 넘겨주며, 다음 부분이 모두 수행되면 다시 필터로 완전한 응답 객체와 함께 제어권이 넘어온다. 따라서 filterChain.doFilter()메소드를 기준으로 전처리, 후처리 부분으로 나뉜다.

[doFilter() 메소드 사용 예]

@Override
public void doFilter(ServletRequest request, SercletResponse response,
					FilterChain filterChain)
                    throws IOException, ServletException{
	System.out.println("JSP 처리 전 필터 수행...");
    filterChain.doFilter(request, response);
    System.out.println("JSP 처리 후 필터 수행...");
                    
}

destroy() 메소드

destroy() 메소드는 필터 인스턴스를 종료하기 전에 호출하는 메소드이다. JSP 컨테이너가 필터 인스턴스를 삭제하기 전에 청소 작업을 수행하는 데 사용되며, 이는 필터로 열린 리소스를 모두 닫을 수 있는 방법이다. destroy() 메소드는 필터의 수명 동안 한 번 만 호출된다.

[destory() 메소드 사용 예]

@Override
public void destroy(){
	System.out.println("필터 해제...");
}

web.xml 파일의 필터 구성

필터를 사용하려면 어떤 필터가 어떤 리소스에 대해 적용되는지 JSP 컨테이너에 알려주어야 한다. 웹 애플리케이션의 /WEB-INF/ 폴더에 존재하는 web.xml 파일을 통해 이루어지므로 web.xml 파일에 필터를 설정한다.

web.xml 파일에 필터를 설정할 때는 <filter><filter-mapping> 요소를 사용한다. web.xml 파일에 여러 개의 필터가 설정되어 있으며 선언된 순서대로 실행된다.

<filter>
	<filter-name>...</filter-name>
    <filter-class>...</filter-class>
    <init-param>
    	<param-name>...</param-name>
        <param-value>...</param-value>
    </init-param>
</filter>
<filter-mapping>
	<filter-name>...</filter-name>
    <url-pattern>...</url-pattern>
</filter-mapping>

[<filter>를 구성하는 하위 요소]

요소설명
<filter-name>필터 이름을 설정한다.
<filter-class>자바 클래스 이름을 설정한다.
<init-param>매개변수와 값을 설정한다.

[<filter-mapping>을 구성하는 하위 요소]

요소설명
<filter-name>필터 이름을 설정한다.
<url-pattern>URL 패턴을 설정한다.

<filter> 요소

<filter> 요소는 웹 애플리케이션에서 자바 필터와 매개변수를 설정하는 데 사용한다.

[<filter> 요소 사용 예]

<filter>
	<filter-name>MyFilter</filter-name>
    <filter-class>ch12.com.filter.LoggingFilter</filter-class>
    <init-param>
    	<param-name>param</param-name>
        <param-value>admin</param-value>
    </init-param>
</filter>

위의 예에서 <init-param> 요소에 설정된 매개변수와 값을 자바 클래스에서 접근하려면 다음과 같이 작성한다.

String value = getServletConfig().getInitParameter("param");

<filter-mapping> 요소

<filter-mapping> 요소는 특정 리소스에 대해 어떤 필터를 사용할지 설정하는 데 사용한다.

[<filter-mapping> 요소 사용 예]

<filter-mapping>
	<filter-name>MyFilter</filter-name>
    <url-pattern>/ch12/filter.jsp</url-pattern>
</filter-mapping>
profile
그냥 해보자 안되더라도 해보자 끝까지 해보자

0개의 댓글