참고글



FilterConfig란
FilterConfig는 필터가 초기화 되는 시점에 호출되는 init() 메서드의 매개변수로 전달되는 객체입니다.
public class MyFilter implements Filter {
 
 
    public void init(FilterConfig config) throws ServletException {
        //필터 객체가 생성 및 초기화 될 때 최초에 한 번 실행
        //FilterConfig 객체를 통해 web.xml에서 설정해둔 설정 값들을 가져올 수 있다.
    }
cs

  


FilterConfig 객체는 web.xml에서 <init-param> 태그를 통해 작성해둔 설정값 정보들과 ServletContext에 대한 참조를 가지고 있으므로 필터 초기화시에 이를 사용하면 유용할 것입니다.



FilterConfig 의 메서드
FilterConfig에서 사용할 수 있는 메서드는 다음과 같습니다.
메서드
리턴타입
설명
getFilterName()
String
필터 등록시 지정한 필터명을 리턴합니다.

getInitParameter(String name)

String
web.xml에서 <init-pram>의 <param-name> 에 지정한 설정명을 매개변수로 넘겨주면 <param-value>로 등록한 값이 리턴됩니다. 설정명에 해당하는 값이 없으면 null을 리턴합니다.
getServletContext()
ServletContext
필터가 속해있는 웹 어플리케이션의 ServletContext를 리턴합니다.

getInitParameterNames()

Enumeration<String>
필터에 설정되어 있는 초기화 설정값들의 설정명들을 Enumeration 으로 리턴합니다. 즉 설정명들을 담은 목록을 리턴합니다.



FilterConfig 예제
FilterConfig를 통한 초기화 설정을 예제를 통해 살펴보겠습니다. 브라우저로부터의 모든 요청시마다 인삿말을 System.out.println()을 통해 출력하는 필터를 구현해볼 것입니다.

설정값으로 인삿말과 인삿말 구문을 출력할지의 여부를 지정할 수 있도록 할것입니다.


HelloFilter.java
인삿말을 출력할 필터클래스인 HelloFilter.java 입니다.
package test;
 
 
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;
 
 
public class HelloFilter implements Filter {
    
    private boolean printYn = false;
    private String greeting = "hi";
 
 
    public void init(FilterConfig config) throws ServletException {
        String printYn = config.getInitParameter("printYn");
        String greeting = config.getInitParameter("greeting");
        
        if(printYn != null) {
            this.printYn = Boolean.valueOf(printYn);
        }
        
        if(greeting != null) {
            this.greeting = greeting;
        }
    }
    
    public void doFilter(ServletRequest request, ServletResponse  response, FilterChain chain)
            throws IOException, ServletException {
        
        if(this.printYn) {
            System.out.println(this.greeting);
        }
        
        chain.doFilter(request, response);
        
    }
 
 
    public void destroy() {}
}
 
cs


init()메서드는 서블릿 컨테이너에서 필터 객체를 생성할때 최초에 한 번 실행하는 메서드입니다. init() 메서드에서는 FilterConfig의 getInitParameter() 메서드를 이용해 web.xml에서 설정해둔 설정값(파라미터)를 가져올 수 있습니다. 단 String 타입으로 리턴되기 때문에 원하는 타입으로 형변환 하여 사용하도록 합니다.

여기서는 인삿말 출력 여부를 printYn이라는 설정으로 사용하고 인삿말로 출력할 문구greeting이라는 설정으로 사용합니다. 리턴받은 설정값은 필터객체의 멤버변수로 저장합니다.
    public void init(FilterConfig config) throws ServletException {
        String printYn = config.getInitParameter("printYn");
        String greeting = config.getInitParameter("greeting");
        
        if(printYn != null) {
            this.printYn = Boolean.valueOf(printYn);
        }
        
        if(greeting != null) {
            this.greeting = greeting;
        }
    }
cs



필터링을 처리하는 doFilter() 메서드에서는 인삿말 여부 설정에 따라 지정한 인삿말 구문을 출력한 이후 제어를 필터체인을 사용하여 넘깁니다.
    public void doFilter(ServletRequest request, ServletResponse  response, FilterChain chain)
            throws IOException, ServletException {
        
        if(this.printYn) {
            System.out.println(this.greeting);
        }
        
        chain.doFilter(request, response);
        
    }
cs



web.xml
web.xml에는 필터 등록과 URL 맵핑설정 그리고 초기화 파라미터(설정값)를 지정할 수 있습니다.
      <filter>
            <filter-name>helloFilter</filter-name>
            <filter-class>test.HelloFilter</filter-class>
            <init-param>
                  <param-name>printYn</param-name>
                  <param-value>true</param-value>
            </init-param>
            <init-param>
                  <param-name>greeting</param-name>
                  <param-value>hi hello 안녕!</param-value>
            </init-param>
      </filter>
      
      <filter-mapping>
            <filter-name>helloFilter</filter-name>
            <url-pattern>/*</url-pattern>
      </filter-mapping>
cs


여기서 중요한점은 <init-param>입니다. <init-param>은 필터 등록시 초기화 파라미터를 등록할 때 사용하는 태그입니다.
      <filter>
            <filter-name>helloFilter</filter-name>
            <filter-class>test.HelloFilter</filter-class>
            <init-param>
                  <param-name>printYn</param-name>
                  <param-value>true</param-value>
            </init-param>
            <init-param>
                  <param-name>greeting</param-name>
                  <param-value>hi hello 안녕!</param-value>
            </init-param>
      </filter>
cs


<param-name>으로 파라미터명을 <param-value>로 파라미터 값을 지정합니다. 이 값들은 모두 문자열(String) 타입입니다.
  • <init-param> - 초기화 파라미터 등록시 사용(여러번 사용 가능)
  • <param-name> - 파라미터명 지정
  • <param-value> - 파라미터 값 지정(String 타입으로 등록됨)





테스트
웹 어플리케이션 경로로 호출하면 콘솔에는 다음과 같은 인삿말이 출력됩니다. 출력 여부와 인삿말을 바꿔가며 테스트 해보시기 바랍니다.






FilterConfig와 <init-param>을 사용했을때의 이점
web.xml에 <init-param> 태그를 통해 초기화 설정값을 관리하면 나중에 어플리케이션을 운영하면서 유지보수시에 큰 이점이 있습니다. 만약 여러 설정들을 필터 클래스 작성시에 하드코딩(특정 값을 코드상에서 직접 할당하는것) 한다면 어떨까요?

 

참고 -  [서블릿/JSP] 요청 파라미터 한글 인코딩 처리 필터(Filter) 구현하기


예를 들어 한글 인코딩 처리 필터에서 인코딩값을 다음과 같이 하드코딩 한다면 이후에 인코딩 값을 변경하고자 할 때 코드를 수정하고 컴파일하고 빌드, 배포하는 일련의 과정들을 다시 수행해야 합니다. 
    public void init(FilterConfig config) throws ServletException {
        this.encoding = "UTF-8";
    }
cs

한번이면 상관이 없지만 자주 수정되는 설정이거나 설정해야할 대상이 늘어날수록 이런 과정은 많은 시간을 소비하게 됩니다. 따라서 이런 변경 될 수 있는 설정값들을 web.xml같은 설정파일로 분리하게 되면 생산성에 이점이 있는것입니다.

  • 하드코딩한 설정을 변경할때마다 코드수정, 컴파일, 빌드, 서버에 배포 과정을 수행해야함
  • web.xml 설정과 FilterConfig를 이용하면 web.xml에서 값만 변경 후 서버만 재기동 하면 됨




<init-param> 설정값에 한글 사용시 오류가 발생하는 경우
추가적으로 설정값에 한글이 들어가는 경우 오류가 발생할 수 있는데, 이는 web.xml에 한글 관련 인코딩 설정이 되어있지 않기 때문입니다.

다음과 같이 가장 첫줄처럼 <?xml> 태그의 encoding 속성값에 한글이 포함되어 있는 인코딩 설정을 넣어줘야 합니다.
<?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/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"; 
    id="WebApp_ID" version="3.1">
 
 
    ..내용생략..
 
 
</web-app>
cs



관련글

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,