Sự khác biệt giữa Interceptor và Filter trong Spring MVC


108

Tôi hơi bối rối về FilterInterceptormục đích.

Như tôi đã hiểu từ tài liệu, Interceptorđược chạy giữa các yêu cầu. Mặt khác Filterđược chạy trước khi hiển thị kết xuất, nhưng sau khi Bộ điều khiển kết xuất phản hồi.

Vậy sự khác biệt giữa postHandle()Interceptor và doFilter()Filter là ở đâu?

Spring MVC sheme Thực tiễn tốt nhất mà nó nên được sử dụng là gì? Trong bức tranh này, nơi làm việc Filtercủa s và Interceptors?

Câu trả lời:


87

Từ HandlerIntercepter's javadoc :

HandlerInterceptorVề cơ bản tương tự như Servlet Filter, nhưng ngược lại với Servlet , nó chỉ cho phép xử lý trước tùy chỉnh với tùy chọn cấm thực thi chính trình xử lý và xử lý hậu tùy chỉnh. Các bộ lọc mạnh mẽ hơn, chẳng hạn như chúng cho phép trao đổi các đối tượng yêu cầu và phản hồi được chuyển xuống chuỗi. Lưu ý rằng bộ lọc được định cấu hình web.xml, HandlerInterceptortrong ngữ cảnh ứng dụng.

Như một hướng dẫn cơ bản, các nhiệm vụ tiền xử lý chi tiết liên quan đến trình xử lý chi tiết là ứng cử viên cho HandlerInterceptorviệc triển khai, đặc biệt là mã trình xử lý chung đã kiểm tra nhân tố và kiểm tra ủy quyền. Mặt khác, a Filterrất phù hợp cho nội dung yêu cầu và xử lý nội dung xem, như biểu mẫu nhiều phần và nén GZIP. Điều này thường cho thấy khi nào người ta cần ánh xạ bộ lọc tới các loại nội dung nhất định (ví dụ: hình ảnh) hoặc cho tất cả các yêu cầu.

Với điều đó đang được nói:

Vậy sự khác biệt giữa Interceptor#postHandle()Filter#doFilter()?

postHandlesẽ được gọi sau khi gọi phương thức xử lý nhưng trước khi khung nhìn được hiển thị. Vì vậy, bạn có thể thêm nhiều đối tượng mô hình hơn vào dạng xem nhưng bạn không thể thay đổi HttpServletResponsevì nó đã được cam kết.

doFilter linh hoạt hơn nhiều so với postHandle . Bạn có thể thay đổi yêu cầu hoặc phản hồi và chuyển nó vào chuỗi hoặc thậm chí chặn xử lý yêu cầu.

Ngoài ra, trong preHandlepostHandlecác phương thức, bạn có quyền truy cập vào phương thức đã HandlerMethodxử lý yêu cầu. Vì vậy, bạn có thể thêm logic trước / sau xử lý dựa trên chính trình xử lý. Ví dụ: bạn có thể thêm một lôgic cho các phương thức xử lý có một số chú thích.

Thực tiễn tốt nhất mà nó nên được sử dụng là gì?

Như tài liệu đã nói, các tác vụ tiền xử lý chi tiết liên quan đến trình xử lý là những ứng cử viên cho HandlerInterceptorviệc triển khai, đặc biệt là mã trình xử lý chung có yếu tố và kiểm tra ủy quyền. Mặt khác, a Filterrất phù hợp cho nội dung yêu cầu và xử lý nội dung xem, như biểu mẫu nhiều phần và nén GZIP. Điều này thường cho thấy khi nào người ta cần ánh xạ bộ lọc tới các loại nội dung nhất định (ví dụ: hình ảnh) hoặc cho tất cả các yêu cầu.


Lưu ý rằng một bộ lọc được định cấu hình trong web.xml, một HandlerInterceptor trong ngữ cảnh ứng dụng ??? bạn có thể giải thích không?

4
Bộ lọc có liên quan đến API Servlet và HandlerIntercepterlà một khái niệm cụ thể của Spring. Để đăng ký một bộ lọc servlet, bạn có thể đăng ký nó bằng cách sử dụng phương pháp cũ web.xml(Servlet 2.5 và các phiên bản cũ hơn) hoặc phương pháp lập trình mới (Servlet 3+). Vì HandlerIntercepterchỉ là một bản tóm tắt của Mùa xuân, bạn nên đăng ký trong bối cảnh của Mùa xuân
Ali Dehghani

Bộ lọc liên quan đến API Servlet và HandlerIntercepter là một khái niệm cụ thể của Spring. coorect! nhưng bất cứ điều gì bạn đăng ký bằng web.xml đều là một phần của WebApplicationnó duy nhất cho mỗi người điều phối, do đó, servlet và bộ lọc đều được kết hợp với ngữ cảnh, nên thực hành tốt để liên kết bộ đánh chặn và bộ lọc với rootContextnhư vậy nếu bạn có nhiều người điều phối tất cả có thể chia sẻ cùng một.

9

Bộ lọc : - Bộ lọc như tên gợi ý là một lớp Java được thực thi bởi thùng chứa servlet cho mỗi yêu cầu HTTP đến và cho mỗi phản hồi http. Bằng cách này, có thể quản lý các yêu cầu đến HTTP trước khi chúng tiếp cận tài nguyên, chẳng hạn như trang JSP, một servlet hoặc một trang tĩnh đơn giản; theo cách tương tự có thể quản lý phản hồi gửi đi HTTP sau khi thực thi tài nguyên.

Interceptor : - Spring Interceptor tương tự như Servlet Filters nhưng chúng hoạt động trong Spring Context nên rất mạnh để quản lý HTTP Request và Response nhưng chúng có thể thực hiện các hành vi phức tạp hơn vì có thể truy cập vào tất cả các bối cảnh Spring.


2
nguồn: mkjava.com/tutorial/filter-vs-interceptor phải đề cập đến nguồn
Premraj

còn bộ lọc bảo mật Spring thì sao, nó cũng cung cấp cho bạn ngữ cảnh mùa xuân.
Yêu

6

HandlerInterceptor cung cấp cho bạn khả năng kiểm soát chi tiết hơn là một bộ lọc, bởi vì bạn có quyền truy cập vào "trình xử lý" đích thực - điều này có nghĩa là bất kỳ hành động nào bạn thực hiện có thể khác nhau tùy thuộc vào những gì yêu cầu thực sự đang thực hiện (trong khi bộ lọc servlet được áp dụng chung cho tất cả các yêu cầu - chỉ có thể tính đến các tham số của mỗi yêu cầu). HandlerInterceptor cũng cung cấp 3 phương thức khác nhau để bạn có thể áp dụng hành vi trước khi gọi một trình xử lý, sau khi trình xử lý đã hoàn thành nhưng trước khi hiển thị chế độ xem (nơi bạn thậm chí có thể bỏ qua hoàn toàn việc hiển thị chế độ xem) hoặc sau khi chính chế độ xem đã được hiển thị. Ngoài ra, bạn có thể thiết lập các bộ đánh chặn khác nhau cho các nhóm trình xử lý khác nhau - các bộ đánh chặn được định cấu hình trên handlerMapping và có thể có nhiều handlerMapping.

Do đó, nếu bạn có nhu cầu thực hiện điều gì đó hoàn toàn chung chung (ví dụ: ghi lại tất cả các yêu cầu), thì một bộ lọc là đủ - nhưng nếu hành vi phụ thuộc vào trình xử lý mục tiêu hoặc bạn muốn thực hiện điều gì đó giữa xử lý yêu cầu và hiển thị chế độ xem, thì HandlerInterceptor cung cấp tính linh hoạt đó.

Tham khảo: http://static.springframework.org/sp...ng-interceptor


2
Liên kết bị hỏng.
Jason Law
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.