티스토리 뷰
Filter란?
만약 각 서블릿마다 한글 인코딩을 위해
request.setCharacterEncoding("UTF-8");을 작성해야한다면 매우 불편할 수 있다.
이럴 때 사용할 수 있는게 filter 이다.
공통적인 처리(filter)를 추가하여 통신의 사이 사이에서 지정한 동작을 만들어 낼 수 있다.
예를 들어 전달받은 데이터를 인코딩해야한다든지, 세션 데이터를 인증하거나 이벤트나 공지 등의 팝업을 추가
하는 경우들과 같은 상황에 필요할 수 있다.
1. 필터 클래스 작성
자바 클래스 파일을 하나 생성한 후 아래 코드를 작성합니다.
Filter는 인터페이스기 때문에 꼭 메소드를 재정의해야한다.
package org.sample.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
public void init (FilterConfig filterConfig)
웹컨테이너(톰캣)이 시작될 때 필터 객체를 생성하는데, 이때 객체가 생성되면서 최초에 한 번 호출되는 메서드입니다. FilterConfig 객체를 넘겨주기 때문에 이를 통해 여러가지 설정값을 넘겨받을 수 있고 필터에서 처리시 필요한 객체등을 초기화(예를들어 JDBC 커넥션 등) 하는데 사용됩니다.
public void destroy()
필터 객체가 제거될 때 실행되는 메서드입니다.
보통 초기화시 생성했던 자원들을 종료하는 기능에 사용됩니다.
public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain)
필터의 핵심 메서드입니다. doFilter()는 클라이언트의 요청이 있을때마다 매번 실행됩니다.
ServletRequest와 ServletResponse 객체를 넘겨주기 때문에 이를 가지고 요청과 응답을 조작할 수 있습니다.
그리고 FilterChain을 통해 조작 이후 요청을 원래 목적지인 서블릿으로 전달할 수 있습니다.
2. Filter 설정
Filter 설정은 Servlet 설정과 비슷하게 두가지 방법이 있다.
1) web.xml 내용 추가
다음 내용을 <web-app>태그 사이에 추가합니다.
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.sample.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter> : 필터를 등록. <filter-name> 에 필터의 이름을 지정하고, 구현한 필터 클래스를 패키지명까지 포함하여
<filter-class>에 작성한다. 톰캣에서 서버를 시작할 때 <filter>태그를 읽어서 객체를 생성하고 초기화한다.
<filter-mapping> : 등록한 필터의 동작할 대상을 설정. <url-pattern>은 대상이 될 패턴을 규칙있게 입력한다.
위와 같이 작성시 모든 것을 대상으로 하고, *.jsp와 같이 모든 jsp 요청에 동작한다든지 원하는 패턴을 작성한다.
만약 특정 서블릿을 대상으로 필터링 하고 싶다면 <servlet-name> 태그를 사용하여 등록한 서블릿 이름을 입력한다.
2) Annotation 방식
해당 필터 클래스 위에 @WebFilter(url패턴)을 추가하기만 하면된다.
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
3. 필터 클래스 수정
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
chain.doFilter()를 호출하여 요청이 왔을 때 흐름(네트워크 동작)을 멈추지않고 다음 필터나 서블릿으로 넘긴다.
넘기기 전에 request.setCharacterEncoding("UTF-8"); 을 추가하여 모든 서블릿의 입력에 인코딩 방식을 지정할 수 있다. 모든 서블릿은 인코딩 필터가 적용된 환경을 가지게 된다. 이제 각 서블릿 클래스마다 인코딩 지정 코드를 작성하지 않아도 된다.
이렇게 Filter를 사용하여
모든 대상 또는 특정 대상들이 특정 동작을 할 수 있도록 편리하게 지정할 수 있다.
'백엔드 및 서버' 카테고리의 다른 글
[ Spring ] DI (Dependency Injection) xml 방식 설명 및 사용법 (0) | 2021.01.22 |
---|---|
[ JSP / Servlet ] MVC 패턴이란? (0) | 2020.12.04 |
[ JSP / Servlet ] GET, POST 방식 전송 (0) | 2020.12.02 |
[ JSP / Servlet ] 서블릿 출력 형식, 컨텐츠 형식 , 인코딩 형식 지정하기 - 한글이 깨지거나 원하는 출력이 나타나지 않는다면? (0) | 2020.12.02 |
[ JSP / Servlet ] jsp, servlet, maven, tomcat 서버 설정 (0) | 2020.11.25 |