Filter는 클라이언트의 요청과 응답을 가로채어 특정한 처리를 할 수 ㅇㅆ는 기능을 제공합니다. 주로 Servlet Container 수준에서 동작하여, 요청이 DispatcherServlet에 도달하기 전이나 응답이 클라이언트에 전달되기 전에 필요한 작업을 수행합니다.
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {}
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
default void destroy() {}
}
init() : 필터 초기화 메서드로, 필터가 생성될 때 한 번 호출됩니다.doFilter() : 필터의 핵심 로직을 수행하며, 모든 요청에 대해 호출됩니다.destroy() : 필터가 제거될 때 호출되어 자원을 해제합니다.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 전처리 로직
chain.doFilter(request, response);
// 후처리 로직
}
전처리 로직 : chain.doFilter() 호출 전에 실행되며, 요청을 가로채어 필요한 작업을 수행합니다.
후처리 로직 : chain.doFilter() 호출 후에 실행되며, 응답에 대한 처리를 수행합니다.
public class LoginCheckFilter implements Filter {
private static final String[] WHITE_LIST = {"/login", "/signup", "/resources/*"};
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String requestURI = httpRequest.getRequestURI();
try {
if (needsAuthentication(requestURI)) {
HttpSession session = httpRequest.getSession(false);
if (session == null || session.getAttribute("USER") == null) {
httpResponse.sendRedirect("/login?redirectURI=" + requestURI);
return;
}
}
chain.doFilter(request, response);
} catch (Exception e) {
throw e;
}
}
private boolean needsAuthentication(String requestURI) {
return !Arrays.stream(whiteList).anyMatch(requestURI::startsWith);
}
}
public class FilterConfig {
@Bean
public FilterRegistrationBean<LoginCheckFilter> loginCheckFilter() {
FilterRegistrationBean<LoginCheckFilter> registrationBean = new FilterRegistrationBean<>();
// 등록할 필터 객체를 설정 (LoginCheckFilter를 필터로 사용)
registrationBean.setFilter(new LoginCheckFilter());
// 필터의 순서를 지정 (값이 낮을수록 먼저 실행됨)
registrationBean.setOrder(1);
// 필터를 적용할 URL 패턴을 설정 ("/*" 는 모든 요청에 대해 필터를 적용)
registrationBean.addUrlPatterns("/*");
// 필터 설정을 반환하여 스프링 컨테이너에 등록
return registrationBean;
setOrder(1): 필터의 실행 순서를 지정합니다.