개인적으로 필터는 웹 프로그래밍에서 중요한 역할을 담당한다고 생각한다.
필터는 말 그대로 클라이언트의 요청을 선처리하거나 서버의 자원을 가공하여 보내주는 역할을 한다.
이런 필터는 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/
'프로그래밍 > 웹 프로그래밍' 카테고리의 다른 글
[Java] java.lang.ArrayIndexOutOfBoundsException (0) | 2018.05.14 |
---|---|
[Error]Eclipse에서 Tomcat Server 구동시 Timeout Error (0) | 2018.05.02 |
팩토리를 이용한 Beans 클래스 해석 in Java, JSP(객체 자동 생성 및 재사용을 높이는 방법) (0) | 2018.04.23 |
Get / Post 차이점에 대해 알아보자 (0) | 2018.04.17 |
싱글톤 패턴 (0) | 2018.04.09 |