개인적으로 필터는 웹 프로그래밍에서 중요한 역할을 담당한다고 생각한다.


필터는 말 그대로 클라이언트의 요청을 선처리하거나 서버의 자원을 가공하여 보내주는 역할을 한다.




이런 필터는 web.xml에 선언되어 계속해서 만들어지는 것이 아닌 한 번 만들어진 클래스가 계속해서 재사용 되는 아주 뛰어난 성능을 가지고 있다.


원래라면 인코딩 정보, 로그인 정보 기타등등 반복해서 사용하는 자원을 이용 할 때 모든 JSP파일, 혹은 Java 클래스 파일에 <% %>, encoding, session, cookie... 이러한 코드를 전부다 넣어 처리해야 한다. 


그러나 이런 반복적인 일을 필터를 사용하면 손쉽게 처리할 수 있다.


웹 프로그래밍에서 가장 먼저 만나는 UTF-8 필터를 예시로 들어보겠다.





import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;


/**

 * Servlet Filter implementation class EncodingFilter

 */

public class EncodingFilter implements Filter {


    /**

     * Default constructor. 

     */

    public EncodingFilter() {

        // TODO Auto-generated constructor stub

    }


/**

* @see Filter#destroy()

*/

public void destroy() {

// TODO Auto-generated method stub

}


/**

* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)

*/

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

// TODO Auto-generated method stub

// place your code here

// 먼저 한글 처리를 하고 뒤로 보낸다.

request.setCharacterEncoding("UTF-8"); // 리퀘스트를 utf-8로 인코딩한다.

response.setContentType("text/html;charset=utf-8");

System.out.println("한글 처리함.");

// pass the request along the filter chain

// 만약 인코딩 말고 다른 처리도 필요하다면 filter chain이라는 기법으로 여러 필터를 연결하여 필터링 할 수 있다.

chain.doFilter(request, response);

}


/**

* @see Filter#init(FilterConfig)

*/

public void init(FilterConfig fConfig) throws ServletException {

// TODO Auto-generated method stub

}


}





원래라면 모든 JSP 파일에 아래와 같은 코드를 넣어 UTF-8 인코딩을 해야한다.


<% request.setCharacterEncoding("UTF-8"); // 리퀘스트를 utf-8로 인코딩한다.

     response.setContentType("text/html;charset=utf-8"); %>


이런 처리를 안 하면 클라이언트의 요청이 들어왔을 때 한글처리가 제대로 되지 않아 문제가 발생하기 때문이다.




이렇게 좋은 Filter도 사용하기 위해서 web.xml에 설정을 해주어야 한다.


설정은 간단하다.


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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://xmlns.jcp.org/xml/ns/javaee"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

id="WebApp_ID" version="3.1">

<display-name>filterPractice</display-name>

<filter>

<filter-name>encoding</filter-name>

<filter-class>com.filterPractice.filter.EncodingFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>encoding</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


</web-app>




이렇게 생긴 web.xml 파일을 /WebContent/WEB-INF/web.xml 에 넣어주면 된다.


web.xml 파일을 해석해보면 아래와 같다.


<filter-name>: 말 그대로 필터의 이름이다. <filter></filter>, <filter-mapping></filter-mapping>에 들어가는 이름이 같아야 한다.

<filter-class>: 필터가 있는 위치이다. 여기서는 com.filterPractice.fillter라는 자바 패키지에 EncodingFilter.java를 만들었다는 의미이다.

<url-pattern>: 어떤 형태의 url을 잡아낼 것인지 결정하는 부분이다. 여기서는 /*로 모든 주소값에서 다 적용시키는 방법을 이용하였다.





마무리로 정리하자면


1. 필터는 재사용성이 높은 클래스 파일로 클라이언트-서버 간에 자원을 주고받을 때 반복해서 처리하는 일(인코딩, 로그인 확인 등)을 한다.

2. 필터를 사용하기 위해서는 web.xml에 설정을 해줘야 한다.

3. 여러개의 처리가 필요하다면 filter chain이라는 기법으로 필터를 여러개 연결하여 필터링 할 수 있다.




ref.

IBM, DeveloperWorks  /  Taming your Tomcat : Filtering tricks for Tomcat 5

- https://www.ibm.com/developerworks/library/j-tomcat2/

+ Recent posts