목차
필터(Filter)란?
클라이언트에서 서블릿으로 요청하고 응답을 처리할 때, 서블릿이 요청 받기 전과 응답 처리 전에 임의의 특정 작업을 수행하도록 Filter API를 사용할 수 있습니다. 즉, 서블릿이 실행되기 전의 선처리 작업과 응답 전의 후처리 작업이 가능합니다. 필터가 수행되는 시점은 요청된 서블릿이 수행되기 전과 후이며, 필터 기능을 사용하여 서블릿의 처리와 유지 보수를 더욱 효과적으로 처리할 수 있습니다. 필터 기능을 활용하여 처리하는 기능 중 대표적인 것이 한글 처리입니다. 필터를 활용하면 여러 페이지에서 수행해야 하는 한글 처리를 한 번의 작업으로 처리할 수 있게 됩니다.
필터 객체의 메소드
메소드 | 기능 |
init(FilterConfig) | 필터 객체 생성시 호출되는 메소드. 필터 객체는 웹 애플리케이션 서비스가 올라가면서, 즉 웹 서버가 시작될 때 한 번만 생성된 다음 계속 재사용되므로 init() 메소드는 서버가 시작될 때 한 번만 호출된다. 따라서 init() 메소드에는 주로 초기화 기능을 구현한다. |
doFilter(ServletRequest, ServletResponse, FilterChain) | doFilter() 메소드는 필터링 설정한 서블릿을 실행할 때마다 호출되는 메소드로서, 실제 필터링 기능을 구현하는 메소드이다. 세 번째 인자로 전달되는 FilterChain 객체는 web.xml 파일에서 모든 <filter-mapping> 태그에 관한 정보를 가지고 있다. |
destroy() | 필터 객체가 삭제될 때 호출되는 메소드. 따라서 destroy() 메소드에는 주로 자원 해제 기능을 구현한다. |
필터 구현
- 필터 기능을 구현하려면 서블릿과 별도의 클래스로 분리해야 하며, javax.servlet.Filter를 상속받아야 합니다.
- Filter를 상속받은 필터 클래스의 doFilter 메소드 내에 클라이언트로부터 요청받은 페이지 실행 전이나 후에 필터링할 내용을 구현합니다.
- 구현된 필터가 어떤 페이지를 필터링하는지 web.xml 파일에 설정합니다.
- 필터링이 설정된 페이지가 클라이언트로부터 요청될 때 자동으로 필터 기능이 실행됩니다.
form에서 한글 데이터를 전송해 보겠습니다.
<!-- test.html -->
<form action="TestServlet" method="post">
<input type="text" name="data">
<input type="submit">
</form>
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet.doGet()");
String data = request.getParameter("data");
System.out.println(data);
}
}
요청받은 서블릿에서 요청에 대한 한글 처리를 하고 있지 않기 때문에 한글 깨짐 현상이 발생합니다.
이번에는 필터 클래스를 작성하고 web.xml 파일에 필터 설정을 해 보겠습니다.
public class MyEncodingFilter implements Filter {
@Override
public void destroy() {
System.out.println("MyEncodingFilter.destroy()");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyEncodingFilter.init()");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("MyEncodingFilter.doFilter() 요청 ========= ");
//request 인코딩 설정
request.setCharacterEncoding("utf-8");
//chain이 가지고 있는 정보(web.xml에 설정된 매핑 서블릿들)를 근거로 다음에 실행할 메소드를 실행하는 역할
chain.doFilter(request, response);
System.out.println("MyEncodingFilter.doFilter() 응답 ========= ");
}
}
<!-- web.xml -->
<filter>
<filter-name>MyEncodingFilter</filter-name>
<filter-class>com.filter.MyEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyEncodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 모든 주소에 대한 필터 처리 -->
</filter-mapping>
처음 test.html 파일 실행시부터 필터 처리가 수행되는 것을 확인할 수 있습니다. 이후 form의 데이터를 제출하여 서블릿에 요청이 갈 때 다시 필터 처리가 되어 한글이 깨지지 않고 출력되고 있습니다.
참고
처음 해보는 Servlet&JSP 웹 프로그래밍 (오정임 지음, 루비페이퍼)
'WEB > Servlet, JSP' 카테고리의 다른 글
[JSP] EL 사용법 (0) | 2022.07.17 |
---|---|
[JSP] JSP 기본 문법 - JSP 스크립팅 요소, 내장 객체 (0) | 2022.07.16 |
[Servlet] 요청 재지정 - sendRedirect(), forward(), include() (0) | 2022.07.10 |
[Servlet] 상태 정보 유지 기술 (0) | 2022.07.10 |
[Servlet] 서블릿 파라미터 init-param, context-param 태그 (0) | 2022.07.10 |
댓글