Filter 개요

그동안 post방식을 사용할 때마다 아래의 코드를 썼다.

1
2
//1. post 방식일 때 한글 처리
request.setCharacterEncoding("utf-8");
cs

 

프로그램을 작성하다 보면 여러 파일에 걸쳐서 반복되는 코드가 등장하는 경우가 있다. 이런 코드의 반복은 프로그램의 유지보수를 어렵게 만들며, 개발자의 실수를 유발하기도 한다. 필터(filter)는 여러 서블릿 클래스에서 반복되는 코드를 일괄적으로 처리할 때 사용한다.

 


Filter란?

  • 웹 프로젝트에서 어떤 요청을 받기 전 전처리 역할을 한다.
  • 주로 post방식의 데이터 한글 처리 역할을 많이 한다.
  • 필터를 사용하는 방법에는 2가지가 있다.
    1. web.xml에 등록하는 방법
    2. @WebFilter annotation을 이용해 등록하는 방법

Filter 사용 방법 - 1. web.xml에 등록

<순서>

  1. web.xml에 filter 태그를 사용하여 사용할 필터 등록
  2. 필터 클래스 구현

[경로: src/main/webapp/WEB-INF/web.xml]

1
2
3
4
5
6
7
8
9
10
11
12
<filter>
      <filter-name>encodingFilter</filter-name>
      <filter-class>common.filter.EncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
</filter>
<filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>
cs
  • <filter>: 등록할 필터를 나타내는 태그
  • <filter-name>: 등록할 필터의 이름을 나타내는 태그
  • <filter-class>: 등록할 필터의 위치를 나타내는 태그
  • <init-param>: 필터가 초기화될 때 전달되는 파라미터를 나타내는 태그
  • <filter-mapping>: 등록할 필터를 매핑해주는 태그
  • <url-pattern>: 필터가 처리할 url을 나타내는 태그
    /* => 모든 사이트에 대해서 필터링

[필터 클래스 구현: src/main/java/common.filter/EncodingFilter]

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
public class EncodingFilter extends HttpFilter implements Filter {
    
    private String charset;
    
    public void init(FilterConfig fConfig) throws ServletException {
        //FilterConfig는 init() 메서드의 매개변수로 전달되는 객체
        //FilterConfig 객체를 통해 web.xml에서 설정해둔 설정 값들을 가져올 수 있다.
        charset = fConfig.getInitParameter("encoding");
        //web.xml에서 <init-param>의 <param-name>에 지정된 설정명("encoding")을
        //매개변수로 넘겨주면 <param-value>로 등록한 값이 리턴된다. => UTF-8 리턴
        System.out.println("EncodingFilter init()...charset: " + charset);
    }
 
    //FilterChain 객체: 필터의 수행과정을 연속적으로 하기 위한 객체 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("EncodingFilter doFilter()...");
        request.setCharacterEncoding(charset); //인코딩 설정
        chain.doFilter(request, response); //다음 필터 또는 서블릿이 실행되도록 흐름을 넘김
    }
    
    public void destroy() {
        System.out.println("EncodingFilter destroy()...");
    }
    
}
cs
  • 이클립스가 제공하는 필터 클래스는 기본적으로 HttpFilter를 상속(extends)하고, Filter 인터페이스를 구현(implements)한다.
  • 필터 클래스는 init(), doFilter(), destroy() 메서드를 기본적으로 제공한다.
    • 필터 객체가 생성된 직후에는 init() 메서드가 자동으로 호출되는데, 이 init() 메서드에서 멤버 변수를 초기화한다.
    • 필터가 삭제되기 직전에 호출되는 destroy() 메서드에서는 자원 해제 작업을 처리한다.
    • doFilter() 메서드에서는 실질적으로 필터가 제공할 사전 처리와 사후 처리 로직을 작성한다.

실행 결과: 사이트에서 한글이 깨지지 않는다.

 


Filter 사용 방법 - 2. @WebFilter annotation

@WebFilter("/*"): 모든 파일에 필터를 적용하겠다는 의미

 

[경로: src/main/java/common.filter/EncodingFilter2]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@WebFilter("/*")
public class EncodingFilter2 extends HttpFilter implements Filter {
    
    public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("EncodingFilter init()...");
    }
 
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("EncodingFilter doFilter()...");
        request.setCharacterEncoding("UTF-8"); //인코딩 설정
        chain.doFilter(request, response); //다음 필터 또는 서블릿이 실행되도록 흐름을 넘김
        
    }
    
    public void destroy() {
        System.out.println("EncodingFilter destroy()...");
    }
    
}
cs

실행 결과: 사이트에서 한글이 깨지지 않는다.

+ Recent posts