이것 저것 개발 공부/Servlet
[Servlet] Servlet Filter 구현 예제와 실전 적용 방법
crushed-taro
2025. 5. 15. 21:44
728x90
반응형
[Servlet] Servlet에서 Request와 Response를 가공하는 가장 좋은 방법 | Wrapper 클래스
1. Servlet Filter
1. Servlet Filter 개요
1. Servlet Filter란
- jakarta.servlet.Filter Interface를 상속 받아 구현하는 Class이다.
- HTTP 요청과 응답 사이에서 전달되는 데이터를 가로채어, 서비스에 맞게 변경하고 걸러내는 필터링 작업을 수행한다.
- 필터 설정에 따라 해당하는 요청 및 응답 시에 반드시 거쳐야 하며, 비밀번호 암호화 처리, 인코딩 설정 등 공통 관리에 해당하는 기능을 수행할 수 있다.
- 필터는 인증 필터, 압축 필터, 리소스 접근 트리거 이벤트 필터, 로깅 필터, 이미지 변환 필터, 토크나이져 필터 등 다양하게 활용 가능하다.
2. Servlet Filter 처리 내용
- Request에 대한 처리
- 보안 관련 사항
- 요청 header와 body 형식 지정
- 요청에 대한 log 기록 유지
- Response에 대한 처리
- 응답 stream 압축
- 응답 stream 내용 추가 및 수정
- 새로운 응답 작성
3. Servlet Filter 동작 구조
- 요청 및 응답에 따른 서블릿 수행 전후에 지정한 필터를 거치며 데이터를 가공하는 역할을 한다.
4. Servlet Filter 내부 동작
- 서블릿의 실행 전후에 동작하므로 서블릿의 service() 메소드 실행 전후에 작동한다.
- 필터가 여러 개일 경우 stack 방식으로 순차적으로 수행된다.
5. Filter Chain (Interface)
- Filter를 여러 개 사용하는 경우, Filter Chain으로 동작시킬 수 있다.
- Chain처럼 서로 연결되어 있는 Filter를 doFilter() 메소드를 이용하여 순차적으로 실행시키는 인터페이스이다.
- doFilter() 메소드는 chain으로 연결되어 있는 다음 필터 또는 서블릿을 실행하는 메소드이다.
doFilter(ServletRequest req, ServletResponse res);
- 마지막 필터가 실행된 후에는 service() 메소드를 실행시켜 서블릿의 메소드(= doGet(), doPost())를 실행한다.
2. Servlet Filter 사용
1. DD 설정 (= web.xml 설정)
- Filter를 등록한다.
<filter>
<filter-name>Filter 설정명</filter-name>
<filter-class>Filter 구현 Class명</filter-class>
<init-param> // filter에서 사용한 값 설정
<param-name>초기값 설정명</param-name>
<param-value>초기 설정값</param-value>
</init-param>
</filter>
- url 패턴과 Filter를 mapping한다.
<filter-mapping>
<filter-name>등록된 Filter명</filter-name>
<url-pattern>요청할 페이지 형식</url-pattern>
</filter-mapping>
- Filter를 적용할 서블릿을 지정하여, 서블릿과 Filter를 mapping한다.
<filter-mapping>
<filter-name>등록된 Filter명</filter-name>
<servlet-name>적용할 Servlet명</servlet-name>
</filter-mapping>
2. @WebFilter Annotation 설정
- Filter 인터페이스를 구현한 클래스 상단에 @WebFilter(url-pattern) 어노테이션을 추가한다.
@WebFilter("/first/*")
public class FirstFilter implements Filter {
필터 동작 내용
}
3. Filter Interface method
- init (FilterConfig config);
- 웹 컨테이너가 Filter를 호출하면, init method가 호출되어 Filter 객체를 생성하며 초기화한다.
- 매개변수 FilterConfig는 web.xml에 있는 <filter>정보를 가지고 있다.
- doFilter (ServletRequest req, ServletResponse res, FilterChain chain);
- Filter가 수행될 때 구동하는 method로, 요청 객체와 응답 객체를 사용해 일련의 작업을 수행한 뒤, chain을 통해 가공된 값을 목적지로 전송한다.
- doFilter (ServletRequest req, ServletResponse res, FilterChain chain);
- Filter가 수행될 때 구동하는 method로, 요청 객체와 응답 객체를 사용해 일련의 작업을 수행한 뒤, chain을 통해 가공된 값을 목적지로 전송한다.
4. Filter Class 작성
public class Class명 implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
(Filter 호출 시 작업 설정)
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
(Filtering 작업할 내용)
}
@Override
public void destroy() {
(삭제 시 작업 설정)
}
}
5. Filter Class 활용 예시
- 공통적인 인코딩 설정을 할 CharsetEncodingFilter Class를 작성한다.
import java.io.IOException;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
public class EncodingFilter implements Filter {
private String encodingType;
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest hrequest = (HttpServletRequest) request;
if("POST".equals(hrequest.getMethod())) {
request.setCharacterEncoding(encodingType);
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
/* xml 팡리에 init-param을 지정하여 fConfig로 값을 꺼내 사용 */
encodingType = fConfig.getInitParameter("encoding-type");
}
}
- web.xml에 필터 및 초기 파라미터 값을 등록한다.
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.section02.uses.EncodingFilter</filter-class>
<init-param>
<param-name>encoding-type</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
728x90
반응형