1. Spring Interceptor là gì?
Trong Spring, mỗi khi một yêu cầu (request) được gửi đến controller, yêu cầu đó cần phải vượt qua các Interceptor (có thể là 0 hoặc nhiều) trước khi được xử lý.
Spring Interceptor là một khái niệm tương tự như Servlet Filter, nhưng nó chỉ áp dụng cho các yêu cầu gửi đến một Controller cụ thể.
Bạn có thể sử dụng Interceptor để thực hiện nhiều công việc khác nhau, chẳng hạn như ghi lại Logs, cập nhật các cấu hình trước khi yêu cầu được gửi đến Controller, và đặc biệt, một trong những ứng dụng Spring Boot MVC sử dụng Interceptor là "Ứng dụng web đa ngôn ngữ".
Để tích hợp Interceptor vào ứng dụng của bạn, lớp Interceptor cần thực hiện interface org.springframework.web.servlet.HandlerInterceptor hoặc mở rộng từ lớp org.springframework.web.servlet.handler.HandlerInterceptorAdapter. Đặc biệt, bạn cần phải triển khai ba phương thức sau:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
Lưu ý quan trọng: Phương thức preHandle
sẽ trả về giá trị true
hoặc false
. Nếu trả về true
, nghĩa là yêu cầu sẽ tiếp tục được gửi đến đích (tức là tới Controller).
Điều này cho thấy một yêu cầu có thể phải vượt qua một hoặc nhiều Interceptor trong quy trình xử lý.
2. Sự Giống và Khác Nhau Giữa Filter và Interceptor trong Java Spring
Cả Filter và Interceptor đều là những thành phần quan trọng trong Spring MVC, giúp thực hiện các tác vụ trước hoặc sau khi một yêu cầu HTTP được xử lý. Tuy nhiên, chúng có những điểm khác biệt đáng kể:
Filter là thành phần được triển khai thông qua lớp javax.servlet.Filter. Nó được gọi trước khi yêu cầu HTTP được truyền đến bộ điều khiển (controller). Các tác vụ mà Filter có thể thực hiện bao gồm:
- Thêm hoặc thay đổi tiêu đề HTTP.
- Kiểm tra quyền truy cập người dùng.
- Ghi nhật ký hoạt động của người dùng.
- Thống kê thời gian phản hồi của yêu cầu.
Interceptor, ngược lại, là thành phần được triển khai thông qua giao diện org.springframework.web.servlet.HandlerInterceptor. Nó có thể được gọi trước hoặc sau khi yêu cầu được xử lý bởi controller. Interceptor được dùng để thực hiện nhiều tác vụ tương tự như filter, nhưng với một số khác biệt:
Bảng so sánh giữa Filter và Interceptor
Tính năng | Filter | Interceptor |
---|---|---|
Thời điểm được gọi | Trước khi bộ điều khiển xử lý | Sau khi bộ điều khiển xử lý |
Thực hiện tác vụ không cần biết bộ điều khiển | Có | Không |
Thực hiện tác vụ liên quan đến bộ điều khiển | Không | Có |
Triển khai bởi lớp | javax.servlet.Filter | org.springframework.web.servlet.HandlerInterceptor |
Kết luận: Việc lựa chọn giữa Filter và Interceptor phụ thuộc vào nhu cầu cụ thể của ứng dụng của bạn. Nếu bạn muốn thực hiện các tác vụ mà không cần biết bộ điều khiển nào sẽ được gọi, hãy chọn Filter. Ngược lại, nếu bạn cần thực hiện các tác vụ liên quan đến một bộ điều khiển cụ thể, Interceptor là lựa chọn tối ưu.
source: viblo