필터
Servlet 기반 애플리케이션에서 http 요청과 응답을 가로채서 특정 작업을 수행하는데 사용
웹 애플리케이션에 요청이 들어오기 전 또는 응답이 나가기 전에 처리
FilterChain을 통해 다음 필터 혹은 서블릿으로 요청을 전달
보통 URL을 대상으로 함
예제
import java.io.IOException;
public class AuthenticationFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
HttpSession session = req.getSession();
User sessionUser = (User) session.getAttribute("sessionUser");
if (sessionUser == null) {
resp.sendRedirect("/login-form");
}else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
import com.metacoding.authblog._core.filter.AuthenticationFilter;
import com.metacoding.authblog._core.filter.MerongFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean // 빈으로 등록하면 리턴값이 IoC 등록
public FilterRegistrationBean addAuthFilter() {
FilterRegistrationBean rg = new FilterRegistrationBean();
rg.setFilter(new AuthenticationFilter()); // 필터를 등록
rg.addUrlPatterns("/board/*"); // 필터를 실행할 uri 패턴
rg.addUrlPatterns("/user/*");
rg.setOrder(1); // filter의 실행 순서
return rg;
}
}
인터셉터
Spring MVC에서 제공하는 기능으로, Http 요청을 컨트롤러에 전달히가 전과 후에 특정 작업을 수행
DispatcherServlet과 Controller 사이에서 동작
필터보다 Spring 컨텍스트에 가까운 레벨에서 동작
보통 Controller 및 handler를 대상으로 함
예제
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("Before handling request: " + request.getRequestURI());
return true; // true면 다음 단계 진행
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("After handling request: " + request.getRequestURI());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("Request completed");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**");
}
}
AOP
특정 공텅 기능을 애플리케이션의 핵심 비즈니스 로직과 분리해 모듈화 한 것
메서드 호출 전/후, 예외 발생 시점 등에 특정 작업을 수행
주로 공통 관심사를 처리
프록시 기반
대상 코드에 변경을 가하지 않고 동작
보통 메서드 및 클래스를 대상으로 함
예제
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
@After("execution(* com.example.service.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature().getName());
}
}
Share article