서블릿 filter
서블릿 필터는 요청이 들어올 때마다 요청을 가로채고 사전에 정의한 작업을 수행하고 그 결과를 다음 필터 또는 서블릿에 전달하는 역할을 한다.
필터는 여러 개를 사용할 수 있으며 서블릿을 호출하기 직전이나 직후에 처리해야할 공통된 로직을 필터를 통해서 처리한다.
@WebFilter("/filter/*")
public class TestFilter implements Filter {
public TestFilter() {
System.out.println("생성자");
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("init");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("doFilter start");
chain.doFilter(request, response);
System.out.println("doFilter end");
}
public void destroy() {
System.out.println("destroy");
}
}
Filter라는 인터페이스를 상속받아 사용할 수 있으며 servlet처럼 생명주기가 존재한다.
init과 destroy는 default 메소드이기 때문에 오버라이딩이 강제되지 않으므로 필수적으로 생성하지 않아도 된다.
그러나 doFilter 메소드는 추상 메소드로 되어 있기때문에 필수로 구현해야한다.
톰캣이 로드 될 때 모든 필터 인스턴스는 생성되고 init메소드는 인스턴스가 생성되는 시점에 호출된다.
필터의 설정내용이 있다면 FilterConfig 타입의 객체로 설정을 전달한다.
chain.doFilter는 다음 필터를 호출하는 메소드로 다음 필터가 없다면 서블릿을 호출한다.
이 메소드를 기준으로 서블릿 호출 전에 전처리 내용과 서블릿 수행 후 응답 받기 전의 후처리 내용을 작성한다.
인스턴스가 제거되는 시점에 filter destroy가 호출된다.
public class EncodingFilter implements Filter {
private String encodingType;
@Override
public void init(FilterConfig config) {
encodingType = config.getInitParameter("encoding-type");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String method = ((HttpServletRequest)request).getMethod();
if("POST".equals(method)) {
request.setCharacterEncoding(encodingType);
}
chain.doFilter(request, response);
}
}
필터에서는 인코딩, 암호화, 인증, 이미지 리사이징 등의 처리가 가능하다.
위 코드는 인코딩 처리에 대한 예시로 요청의 method type을 확인하여 POST일 경우에 UTF-8로 인코딩 타입을 설정한다.
필터에 대한 mapping 역시 어노테이션 방식이 아닌 xml 방식도 가능하다.
filter name에 필터의 별칭을 설정하고 filter class에 full class명을 설정한다.
filter-mapping에서 설정한 필터의 별칭과 요청 url을 설정 할 수 있고 여기까지는 servlet 설정과 비슷하다.
filter에서는 init-param에 필터가 생성될 때 사용될 때 사용할 수 있는 FilterConfig를 설정할 수 있다.
'Backend > Servlet & JSP' 카테고리의 다른 글
[Servlet & JSP] JSP의 역할 (0) | 2023.05.27 |
---|---|
[Servlet & JSP] 서블릿 listener (0) | 2023.05.26 |
[Servlet & JSP] 서블릿 cookie와 session (0) | 2023.05.24 |
[Servlet & JSP] 서블릿 forward와 redirect (0) | 2023.05.23 |
[Servlet & JSP] 에러 처리 (0) | 2023.05.22 |
댓글