티스토리 뷰

JSP &Servlet

Servlet Filter

Lurutia 2021. 5. 15. 01:01

필터란?

위 책에서는 'HTTP 요청을과 응답을 변경할 수 있는 재사용 가능한 클래스' 라고 정의한다.

필터는 클라이언트와 최종자원(JSP, Servlet, 기타자원) 사이에 위치하며 request 와 response를 알맞게 변경하는 역할을 한다.

 

필터의 핵심타입 3개

javax.servlet.Filter interface

클라이언트와 최종자원 사이에 위치하는 필터는 이 인터페이스를 구현해야한다.

 

javax.servlet.ServletRequestWrapper 클래스

필터가 요청을 변경한 결과를 저장하는 래퍼

 

javax.servlet.ServletResponseWrapper 클래스

필터가 응답을 변경하기 위해 사용하는 래퍼

 

Filter를 사용하려 Filter interface와 클래스들은 tomcat의 servlet-api.jar에 있으므로 클래스패스에 추가해주어야한다.

 

Filter인터페이스

Filter 인터페이스는 세가지 메소드를 선언하고 있으며 필터의 기능에 맞게 알맞게 구현해 주어야한다.

public void init(FilterConfig filterConfig) throws ServletException

필터를 초기화할 때 호출한다

 

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

필터 기능을 수행 chain을 이용해 다음 필터로 요청을 전달할 수 있다.

 

public void destroy()

필터가 웹 컨테이너에서 삭제될 때 실행된다.

 

example

public class ExampleFilter implements Filter {
	@Override
    public void init(FilterConfig filterConfig) throws ServletException {
    	// filter init
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    	// request 요청 수행
        ...
        // 다음 필터 처리
        chain.doFilter(request, response);
        
        // response를 이용하여 응답의 필터링 작업 수행
    }
    
    @Override
    public void destroy() {
    	// 필터가 사용한 자원 반납
    }
}

 

FilterConfig

init 메서드의 인자로 FilterConfig를 넘겨주는에 FilterConfig는 필터의 초기화 파라미터를 읽어올 때 사용한다. 제공하는 메서드는 아래와 같다.

 

메서드 리턴타입 설명
getFilterName() String 설정 파일에서 filter-name에 지정한 필터의 이름을 리턴
getInitParameter(String name) String 설정파일의 init-param에 지정한 초기화 파라미터 값을 읽어옴 존재하지 않을경우 null을 리턴
getInitParameterNames() Enumeration<String> 초기화 파라미터 이름목록을 불러옴
getServletContext() ServletContext 서블릿 컨텍스트 객체를 불러옴

 

필터 적용하기

필터 적용방법은 두가지가 있다. 하나는 web.xml에 설정하는 것이고 두번째는 @WebFilter 어노테이션을 활용하는것이다.

web.xml

<?xml version="1.0" encoding="utf-8" ?>

<web-app>
	...
   	<filter>
    	<filter-name>FilterName</filter-name>
        <filter-class>main.filter.FilterClass</filter-class>
        <init-param>
        	<param-name>paramName</param-name>
            <param-value>paramValue</param-value>
        </init-param>
    </filter>
    <filter-mapping>
    	<filter-name>FilterName</filter-name>
        <url-pattern>/filter/*.jsp</url-pattern>
        <servlet-name>ApplyServlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
</web-app>

filter

<filter></filter> 안에 사용할 필터이름과 클래스를 정하고 초기화 parameter를 지정해준다.

filter-mapping

filter-mapping에서 필터를 적용할 서블릿을 결정한다. url-pattern을 이용해 특정 경로로 요청했을 때 적용할 수도 있고 servlet-name으로 서블릿 이름을 정할수도 있다.

dispatcher

필터가 적용되는 시점을 정한다

REQUEST : 클라이언트의 요청인 경우 필터를 적용한다(기본값)

FORWARD : forward()를 통해서 이동될 경우 적용된다

INCLUDE : include()를 통해서 포함되는 경우 적용한다

 

어노테이션

@WebFilter(filterName = "myFilter", urlPatterns={ /xml/*.jsp })

public class MyFilter...

 

WebFilter의 주요속성은 다음과 같다.

urlPatterns : 필터를 적용할 URL 패턴 목록

servletNames : 필터를 적용할 서블릿 이름 목록

filtername : 필터의 이름을 지정

initParams : 초기화 파라미터 목록을 지정

dispatcherTypes : 필터를 적용할 범위를 지정한다. 열거 타입인 DispatcherType에 정의된 값을 사용한다. 기본값은 DispatchType.REQUEST다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함