
Giải thích chi tiết từng tầng
| Tầng | Thành phần chính | Vai trò |
|---|---|---|
| Servlet Layer | jakarta.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 Layer | DispatcherServlet, 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 Layer | Database / 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ầng | Thời điểm chạy | Có biết Controller không? |
|---|---|---|
Filter | Trước DispatcherServlet | ❌ Không |
Interceptor | Sau DispatcherServlet | ✅ Có |
Controller | Sau khi xác định được handler | ✅ Chính là nơi xử lý logic request |
Service/Repository | Do 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
HttpServletRequestvàHttpServletResponse. - 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ức | Giai đoạn | Mục đích |
|---|---|---|
preHandle() | Trước khi gọi Controller | Dừng hoặc cho phép request đi tiếp |
postHandle() | Sau khi Controller trả về ModelAndView | Chỉnh sửa dữ liệu trả về (view model) |
afterCompletion() | Sau khi response hoàn tất | Log, 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ính | Filter (Servlet) | Interceptor (Spring MVC) |
|---|---|---|
| Nằm ở tầng | Servlet Container | Spring MVC DispatcherServlet |
| Interface | jakarta.servlet.Filter | org.springframework.web.servlet.HandlerInterceptor |
| Trước / Sau DispatcherServlet | Trước | Sau |
| Truy cập Handler (Controller) | ❌ Không | ✅ Có |
| Can modify response? | ✅ Có | ✅ Có |
| Can block request early? | ✅ Có | ✅ Có |
| Phù hợp cho | Cross-cutting (auth, CORS, logging, encoding, header inject) | Controller-level logic (authorization, validation, timing) |
| Đăng ký qua | @WebFilter, FilterRegistrationBean | WebMvcConfigurer.addInterceptors() |
| Scope | Toàn ứng dụng (Servlet layer) | Spring MVC (REST API routes) |
Tổng kết
| Mục tiêu | Nên dùng |
|---|---|
| Gắn requestId, MDC logging, header manipulation | Filter |
| 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 |
Be First to Comment