참고글
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> 태그를 통해 초기화 설정값을 관리하면 나중에 어플리케이션을 운영하면서 유지보수시에 큰 이점이 있습니다. 만약 여러 설정들을 필터 클래스 작성시에 하드코딩(특정 값을 코드상에서 직접 할당하는것) 한다면 어떨까요?
예를 들어 한글 인코딩 처리 필터에서 인코딩값을 다음과 같이 하드코딩 한다면 이후에 인코딩 값을 변경하고자 할 때 코드를 수정하고 컴파일하고 빌드, 배포하는 일련의 과정들을 다시 수행해야 합니다.
|
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 |
관련글
'Servlet&Jsp' 카테고리의 다른 글
| [서블릿/JSP] 리스너(Listner)란? 이벤트 리스너의 개념 설명. 구현 및 등록하기 (2) | 2019.01.24 |
|---|---|
| [서블릿/JSP] web.xml에서 filter-mapping 설정의 dispatcher 설정에 대하여 (1) | 2019.01.16 |
| [서블릿/JSP] @WebFilter 어노테이션으로 필터 설정하기 (0) | 2019.01.11 |
| [서블릿/JSP] 필터(Filter) 사용 방법 및 예제 (3) | 2019.01.09 |
| [서블릿/JSP] 필터(Filter)란? 필터 개념 및 설명 (0) | 2019.01.08 |