[Spring] Filter
2024. 7. 6. 22:39ㆍBE/Spring
1. Filter란?
필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공합니다.
공통적인 기능들을 서블릿이 호출되기 전후로 수행(전처리)되게 하고 싶다면 Filter를 사용하면 된다.
<!-- web.xml -->
<filter>
<display-name>MyFilter</display-name>
<filter-name>MyFilter</filter-name>
<filter-class>com.company.hello.controller.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/MyFilter</url-pattern>
</filter-mapping>
<url-pattern>/MyFilter</url-pattern>
: 필터링할 url
public class MyFilter extends HttpFilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
}
class MyRequest extends HttpServletRequestWrapper {
public MyRequest(HttpServletRequest request){
super(request);
}
// 재정의 가능함
@Override
public String getParameter(String name){
String data = super.getParameter(name);
if(data == null) return "";
else return data;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 사전 작업
System.out.println("MyFilter : 사전 작업");
HttpServletRequest req = (HttpServletRequest) request;
HttpSession session = req.getSession();
String word = req.getParameter("word");
if("검열".equals(word)) { // 예시
...
// controller까지 안 가도 처리할 수 있다.
}
// request hooking
MyRequest myReq = new MyRequest(req);
// pass the request along the filter chain
chain.doFilter(myReq, response); // Pass!
// 사후 작업
System.out.println("MyFilter : 사후 작업");
response.getWriter().append("Filter는 response를 조작할 수 있다.");
}
public void destroy() {
}
}
불필요하게 Controller
까지 안 가도 된다.
Spring은 Filter
보단 Interceptor
를 사용하길 권하는 것 같다.
인증, 인코딩, 로깅, 이미지 변환 등과 같은 작업을 수행할 때 많이 사용한다.
Filter | Interceptor | AOP | |
구현 | Jakarta.servlet.Filter | org.springframework.web.servlet.HandlerInterceptor | |
관리 컨테이너 | Servlet Container | Spring Container | Spring Container (Root) |
적용 위치 | web.xml | servlet-context.xml | execution으로 설정된 공통 코드 메서드 |
적용 대상 설정 | url | url | execution에서 설정된 메서드(인자), 클래스 등 다양 |
동작 순서 | Dispatcher Servlet 전달 전후 | Controller에게 전달되기 전후 | Proxy 패턴의 형태로 메서드 앞에 실행 |
request/response 객체 조작 가능 여부 | O | X | X |
주요 역할 | Spring에 무관한 웹 자원 처리 | Controller 관련 요청 및 응답 처리 | 주로 Business Logic 처리 후 Controller 처리 |
용도 | 사용자 인증, 권한 검사, 요청과 응답에 대한 로그, 문자열 인코딩, 웹 보안 관련 기능 | 인증 프로세스(로그인, 사용자 권한 관리), 사용자 세션 처리, 프로그램 실행 시간 측정 | 로깅, 트랜잭션, 에러 처리 |
'BE > Spring' 카테고리의 다른 글
[Spring] ControllerAdvice (0) | 2024.07.06 |
---|---|
[Spring] Java Config (0) | 2024.07.06 |
[Spring] AOP (0) | 2024.07.06 |
[Spring] Interceptor (0) | 2024.07.06 |
[Spring] Spring Web Application의 동작 원리 (0) | 2024.07.06 |