Skip to content

So sánh Filter và Interceptor qua sơ đồ luồng HTTP Request trong Spring Boot

Giải thích chi tiết từng tầng

TầngThành phần chínhVai trò
Servlet Layerjakarta.servlet.Filter– Xử lý cấp thấp của HTTP request/response.
– Thường dùng cho logging, CORS, authentication, requestId injection.
Spring MVC LayerDispatcherServlet, HandlerInterceptor, Controller– Router trung tâm của Spring.
– Interceptor dùng để chặn / xử lý logic trước & sau Controller.
– Controller tiếp nhận request và trả response.
Business Layer@Service, @Repository@Service: xử lý nghiệp vụ chính.
@Repository: truy xuất dữ liệu từ DB hoặc API ngoài.
Data LayerDatabase / External API– Lưu trữ dữ liệu thực tế hoặc gọi tới hệ thống khác.

So sánh vị trí hoạt động

TầngThời điểm chạyCó biết Controller không?
FilterTrước DispatcherServlet❌ Không
InterceptorSau DispatcherServlet✅ Có
ControllerSau khi xác định được handler✅ Chính là nơi xử lý logic request
Service/RepositoryDo Controller gọi đến✅ Thực thi logic và truy xuất dữ liệu


Vị trí hoạt động của Filter(Servlet level) và Intercepter(Spring MVC level)

Khi một request HTTP đi vào ứng dụng Spring Boot, nó sẽ đi qua nhiều lớp xử lý trước khi đến controller của bạn:

1. Tầng Servlet Filter

Mục đích:

  • Hoạt động ở mức Servlet container (Tomcat, Jetty,…).
  • Có thể thao tác trực tiếp với HttpServletRequestHttpServletResponse.
  • Chạy trước DispatcherServlet, nên nó không phụ thuộc Spring MVC.
  • Thường dùng để:
    • Log, authentication, CORS, request/response wrapping.
    • Inject requestId, traceId, headers, MDC logging context.
    • Validate JWT token trước khi vào Spring context.

Vòng đời:

  • Đăng ký khi Servlet container khởi động.
  • Gọi init() khi app start, destroy() khi shutdown.

Luồng hoạt động:

  • Gọi doFilter(request, response, chain).
  • Gọi chain.doFilter(...) để chuyển sang filter tiếp theo hoặc DispatcherServlet.
  • Sau khi chain chạy xong, có thể thao tác response trước khi trả về client.

Ví dụ:

@WebFilter("/*")
public class LoggingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("Before Servlet: " + ((HttpServletRequest) req).getRequestURI());
        chain.doFilter(req, res);
        System.out.println("After Servlet");
    }
}

2. Tầng HandlerInterceptor

Mục đích:

  • Hoạt động bên trong Spring MVC, sau khi request đã vào DispatcherServlet.
  • Có thể thao tác ở mức Spring controller.
  • Có thể truy cập HandlerMethod (tức là controller & method được mapping).
  • Thường dùng để:
    • Log chi tiết request theo controller.
    • Kiểm tra quyền (authorization).
    • Thêm header, enrich context.
    • Thống kê thời gian xử lý request, etc.

Các hook chính:

Phương thứcGiai đoạnMục đích
preHandle()Trước khi gọi ControllerDừng hoặc cho phép request đi tiếp
postHandle()Sau khi Controller trả về ModelAndViewChỉnh sửa dữ liệu trả về (view model)
afterCompletion()Sau khi response hoàn tấtLog, cleanup resource

Ví dụ:

@Component
public class LoggingInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
        System.out.println("Before Controller: " + req.getRequestURI());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex) {
        System.out.println("After Controller completed");
    }
}

3. So sánh chi tiết Filter vs Interceptor

Thuộc tínhFilter (Servlet)Interceptor (Spring MVC)
Nằm ở tầngServlet ContainerSpring MVC DispatcherServlet
Interfacejakarta.servlet.Filterorg.springframework.web.servlet.HandlerInterceptor
Trước / Sau DispatcherServletTrướcSau
Truy cập Handler (Controller)❌ Không✅ Có
Can modify response?✅ Có✅ Có
Can block request early?✅ Có✅ Có
Phù hợp choCross-cutting (auth, CORS, logging, encoding, header inject)Controller-level logic (authorization, validation, timing)
Đăng ký qua@WebFilter, FilterRegistrationBeanWebMvcConfigurer.addInterceptors()
ScopeToàn ứng dụng (Servlet layer)Spring MVC (REST API routes)

Tổng kết

Mục tiêuNên dùng
Gắn requestId, MDC logging, header manipulationFilter
Kiểm tra quyền / logging controller-level / đo thời gian xử lýInterceptor
Tác động đến raw request/response (ví dụ wrap InputStream)Filter
Tác động logic vào từng controller cụ thểInterceptor

Published inAll

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *