필터는 서블릿 실행 전후에 어떤 작업을 하고자 할 때 사용하는 기술이다. 예를 들면 클라이언트가 보낸 데이터의 암호를 해제하거나, 서블릿이 실행되기 전 필요한 자원을 미리 준비하거나, 서블릿이 실행될 때마다 로그를 남기는 등의 작업을 필터를 통해 처리할 수 있다.
만약 이런 작업들을 서블릿에 담는다면 서블릿마다 해당 코드를 삽입해야 하고, 필요가 없어지면 그 코드를 삽입한 서블릿을 모두 찾아서 제거해야 하므로 관리하기가 매우 번거로울 것이다.
필터에서 POST 요청으로 넘어온 매개변수의 문자 집합을 설정하는 것을 알아본다. POST 요청인 경우 서버로 보내는 데이터는 메시지 바디에 있는데 서블릿에서 이 데이터를 꺼내려면 getParameter()를 호출한다. 만약 메시지 바디에 한글과 같은 멀티바이트 문자가 있을 때 그냥 getParameter()를 호출하면 한글이 깨진다. 이를 해결하기 위해 setCharacterEncoding()을 호출하여 메시지 바디의 데이터가 어떤 문자집합으로 인코딩되었는지 설정했으나 각 서블릿마다 작성하는 것은 매우 번거로운 일이다. 이 때 서블릿 필터를 사용하면 간단히 처리할 수 있다.
메시지 바디의 문자 집합 설정을 위해 각 서블릿에 작성한 setCharacterEncoding()를 필터로 옮긴다. MemberAddServlet 클래스의 doPost()와 MemberUpdateServlet 클래스의 doPost()에서 setCharacterEncoding()를 주석처리 한다.
- 필터 만들기
매개변수의 문자집합을 설정하는 필터 생성하기 위해 spms.filters 패키지의 CharacterEncodingFilter 클래스를 생성한다. 이후 javax.servlet.Filter 인터페이스를 구현한다.
package spms.filters;
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 CharacterEncodingFilter implements Filter {
//FilterConfig : 필터 초기화 매개변수의 값을 꺼낼 수 있다.
FilterConfig config;
/**
* init() : 필터 객체가 생성되고 나서 준비 작업을 위해 딱 한 번 호출됨
* @param config
* @return
* @throws ServletException
*/
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
/**
* doFilter() : 필터와 연결된 URL에 대해 요청이 들어오면 항상 호출된다. 필터가 할 일 실행.
* @param request,response,nextFilter
* @return
* @throws IOException,ServletException
*/
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain nextFilter) throws IOException, ServletException {
//서블릿이 실행되기 전, 해야할 작업
request.setCharacterEncoding(config.getInitParameter("encoding"));
//다음 필터를 호출, 더 이상 필터가 없다면 내부적으로 서블릿의 service()가 호출됨.
nextFilter.doFilter(request, response);
//서블릿을 실행한 후, 클라이언트에게 응답하기 전에 해야할 작업
}
/**
* destroy() : 웹 애플리케이션을 종료하기 전 서블릿 컨테이너에게 호출되어 마무리 작업을 함
* @param
* @return
* @throws
*/
@Override
public void destroy() {}
}
필터가 되려면 반드시 javax.servlet.Filter 인터페이스를 구현해야 한다. 필터는 서블릿과 마찬가지로 한 번 생성되면 웹 애플리케이션이 실행되는 동안 계속 유지된다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
34. MVC 이해하기 (0) | 2022.01.31 |
---|---|
33. 필터 사용하기 (2) (0) | 2022.01.30 |
31. 컨텍스트 초기화 매개변수 (0) | 2022.01.28 |
30. 서블릿 초기화 매개변수 (2) (0) | 2022.01.26 |
29. 서블릿 초기화 매개변수 (1) (0) | 2022.01.25 |
댓글