제이온

[Spring] Filter, Interceptor, Argument Resolver là gì?

  • Ngôn ngữ viết: Tiếng Hàn Quốc
  • Quốc gia: Tất cả các quốc giacountry-flag
  • CNTT

Đã viết: 2024-04-27

Đã viết: 2024-04-27 00:41

Bộ lọc (Filter) là gì?

Bộ lọc là một tính năng chuẩn của J2EE, cho phép xử lý các tác vụ bổ sung cho tất cả các yêu cầu phù hợp với mẫu URL trước/sau khi yêu cầu được chuyển đến Dispatcher Servlet. Nói cách khác, bộ lọc được quản lý bởi web container (như Tomcat) chứ không phải Spring container, vì vậy nó xử lý yêu cầu trước khi đến Dispatcher Servlet.


[Spring] Filter, Interceptor, Argument Resolver là gì?


Triển khai Bộ lọc (Filter)

Để thêm bộ lọc, bạn cần triển khai giao diện Filter của javax.servlet, giao diện này có 3 phương thức sau:


  • Phương thức init
    • Phương thức này được sử dụng để khởi tạo đối tượng bộ lọc và thêm nó vào dịch vụ. Web container sẽ gọi phương thức init một lần để khởi tạo đối tượng bộ lọc, sau đó các yêu cầu tiếp theo sẽ được xử lý thông qua phương thức doFilter().
  • Phương thức doFilter
    • Phương thức này được thực thi bởi web container trước khi tất cả các yêu cầu HTTP khớp với url-pattern được chuyển đến Dispatcher Servlet và trước khi Dispatcher Servlet gửi phản hồi HTTP đến client.
      Tham số của doFilter() là FilterChain, và bằng cách gọi doFilter() của FilterChain, yêu cầu được chuyển đến đích tiếp theo. Bằng cách chèn các quá trình xử lý cần thiết trước/sau chain.doFilter(), chúng ta có thể thực hiện các xử lý mong muốn.
  • Phương thức destroy
    • Phương thức này được sử dụng để loại bỏ đối tượng bộ lọc khỏi dịch vụ và trả lại các tài nguyên đang sử dụng. Nó sẽ được gọi bởi web container một lần, sau đó doFilter() sẽ không còn xử lý các yêu cầu nữa.


Ví dụ mã - Thông số kỹ thuật Servlet


Ví dụ mã - @Component


  • @Component: Cho phép đăng ký Filter dưới dạng bean của Spring.
  • @Order: Cho phép xác định thứ tự khi có nhiều bộ lọc.
  • Nếu đăng ký Filter theo thông số kỹ thuật Servlet dưới dạng bean của Spring, bạn có thể sử dụng các bean khác của Spring.


Ví dụ mã - @Configuration

Nếu bạn muốn bộ lọc chỉ hoạt động trên một số URI cụ thể, bạn có thể sử dụng FilterRegistrationBean để đăng ký bộ lọc dưới dạng bean của Spring.


Công dụng của Bộ lọc (Filter)

Chủ yếu chịu trách nhiệm xác thực và xử lý các tham số của yêu cầu.


  • Công việc chung liên quan đến bảo mật
    • Vì bộ lọc hoạt động trong web container nên có thể thực hiện kiểm tra bảo mật (phòng thủ XSS, CSRF, v.v.) và chặn các yêu cầu không hợp lệ. Việc chặn yêu cầu trước khi nó đến Spring container sẽ tăng cường tính ổn định.
  • Ghi nhật ký cho tất cả các yêu cầu
  • Nén hình ảnh/dữ liệu và mã hóa chuỗi
    • Bộ lọc đã triển khai các chức năng được sử dụng phổ biến trong ứng dụng web, chẳng hạn như nén hình ảnh hoặc dữ liệu và mã hóa chuỗi.
  • Tùy chỉnh ServletRequest
    • HttpServletRequest chỉ có thể đọc nội dung của Body một lần. Vì vậy, Filter và Interceptor không thể đọc Body. Bạn có thể tạo ServletRequest tùy chỉnh để ghi nhật ký Body.


Bộ chặn (Interceptor)

Bộ chặn (Interceptor) là gì?

Khác với bộ lọc (Filter) là một thông số kỹ thuật chuẩn của J2EE, bộ chặn (Interceptor) là một kỹ thuật do Spring cung cấp, cho phép tham chiếu hoặc xử lý yêu cầu và phản hồi trước và sau khi Dispatcher Servlet gọi Controller. Nói cách khác, bộ chặn hoạt động trong ngữ cảnh Spring chứ không phải web container như bộ lọc.


Dispatcher Servlet yêu cầu ánh xạ trình xử lý để tìm Controller phù hợp và trả về chuỗi thực thi (HandlerExecutionChain). Vì vậy, nếu chuỗi này có đăng ký một hoặc nhiều bộ chặn, thì chúng sẽ được thực thi theo thứ tự trước khi Controller được thực thi, nếu không có bộ chặn nào, Controller sẽ được thực thi trực tiếp.


Triển khai Bộ chặn (Interceptor)

Để thêm bộ chặn, bạn cần triển khai giao diện HandlerInterceptor của org.springframework.web.servlet, giao diện này có 3 phương thức sau:


  • Phương thức preHandle
    • Phương thức preHandle được thực thi trước khi Controller được gọi. Vì vậy, nó có thể được sử dụng cho các công việc xử lý trước Controller, chẳng hạn như xử lý hoặc bổ sung thông tin yêu cầu.
    • Tham số handler thứ 3 của phương thức preHandle là một đối tượng trừu tượng hóa thông tin của phương thức có gắn @RequestMapping.
    • Loại trả về của phương thức preHandle là boolean, nếu trả về true, thì quá trình tiếp tục, nếu trả về false, thì dừng quá trình và các tác vụ tiếp theo (bộ chặn tiếp theo hoặc Controller) sẽ không được thực thi.
  • Phương thức postHandle
    • Phương thức postHandle được thực thi sau khi Controller được gọi. Vì vậy, nó có thể được sử dụng khi có các công việc xử lý sau Controller.
  • Phương thức afterCompletion
    • Như tên gọi của nó, phương thức afterCompletion được thực thi sau khi tất cả các tác vụ hoàn thành, bao gồm cả việc tạo ra kết quả cuối cùng từ tất cả các view.


Ví dụ mã


  • Đăng ký bộ chặn đã tạo dưới dạng bean.
  • Đăng ký bộ chặn đã tạo trong phương thức addInterceptors() của giao diện WebMvcConfigurer.
  • Các bộ chặn sẽ hoạt động theo thứ tự chúng được đăng ký trong InterceptorRegistry.


Công dụng của Bộ chặn (Interceptor)

Chủ yếu chịu trách nhiệm xử lý tính toàn vẹn thông tin yêu cầu bằng cách sử dụng logic dịch vụ.


  • Các tác vụ chung như xác thực/ủy quyền
    • Ví dụ điển hình, bạn có thể kiểm tra các tác vụ liên quan đến yêu cầu của client, chẳng hạn như xác thực hoặc ủy quyền, trước khi chuyển đến Controller.
  • Ghi nhật ký cho các cuộc gọi API
    • Bạn có thể ghi lại thông tin client thông qua các đối tượng HttpServletRequest và HttpServletResponse được truyền vào.
  • Xử lý dữ liệu được chuyển đến Controller
    • Bạn có thể xử lý các đối tượng HttpServletRequest và HttpServletResponse được truyền vào và chuyển chúng đến Controller.
  • Mô phỏng AOP
    • Tham số HandlerMethod thứ 3 của phương thức preHandle chứa thông tin về chữ ký của phương thức sẽ được thực thi, v.v., cho phép bạn xác định xem có nên thực thi logic hay không.


Bộ lọc (Filter) so với Bộ chặn (Interceptor)

  • Bộ lọc được thực thi trong ngữ cảnh web, trong khi bộ chặn được thực thi trong ngữ cảnh Spring, vì vậy thời điểm thực thi của chúng là khác nhau.
  • Bộ lọc có thể xử lý trước và sau Dispatcher Servlet, trong khi bộ chặn có thể xử lý trước và sau Controller.
  • Bộ lọc nên được sử dụng khi cần xử lý các tác vụ toàn cục không liên quan đến Spring, xác thực các tham số đầu vào, hoặc sử dụng ServletRequest thay vì HttpServletRequest.
  • Bộ chặn nên được sử dụng khi cần xử lý các tác vụ toàn cục liên quan đến yêu cầu của client trong phạm vi Spring hoặc khi cần kết hợp logic dịch vụ.
  • Bộ chặn có thể sử dụng @ControllerAdvice và @ExceptionHandler để xử lý ngoại lệ, nhưng bộ lọc thì không.
    • Bộ lọc thường bao bọc phương thức doFilter() bằng khối try~catch để xử lý ngay lập tức các ngoại lệ phát sinh tại thời điểm đó.


Bộ giải quyết đối số (Argument Resolver)

Bộ giải quyết đối số (Argument Resolver) là gì?

Bộ giải quyết đối số (Argument Resolver) có thể gián tiếp tạo ra các đối tượng mong muốn từ các giá trị trong yêu cầu khi có yêu cầu đến Controller.


Công dụng của Bộ giải quyết đối số (Argument Resolver)

Ví dụ, giả sử có một yêu cầu với token JWT. Chúng ta cần xác thực token này và trích xuất id được lưu trữ trong token để tạo ra đối tượng người dùng đã đăng nhập.

Nếu không sử dụng Bộ giải quyết đối số, chúng ta sẽ phải triển khai quá trình xác thực token và chuyển đổi nó thành đối tượng người dùng đã đăng nhập trong mỗi Controller. Điều này dẫn đến mã trùng lặp trong các Controller cần xác thực người dùng và làm tăng trách nhiệm của Controller. Bộ giải quyết đối số có thể giải quyết vấn đề này.


Triển khai Bộ giải quyết đối số (Argument Resolver)

Bộ giải quyết đối số (Argument Resolver) có thể được sử dụng bằng cách triển khai giao diện HandlerMethodArgumentResolver. Giao diện này yêu cầu triển khai hai phương thức sau:



  • Phương thức supportsParameter
    • Chúng ta tạo ra một annotation nào đó và gắn nó vào Parameter mà chúng ta muốn Argument Resolver thực thi. Phương thức supportsParameter() kiểm tra xem parameter của phương thức được yêu cầu có chứa annotation mong muốn hay không và trả về true nếu nó có chứa.
  • Phương thức resolveArgument
    • Nếu nhận được true từ supportsParameter, tức là có một phương thức nào đó được gắn annotation, thì phương thức này sẽ thực hiện bind parameter thành dạng mong muốn và trả về.


Khi sử dụng Bộ giải quyết đối số, việc triển khai Controller sẽ như sau:



Sự khác biệt giữa Bộ giải quyết đối số (Argument Resolver) và Bộ chặn (Interceptor)

  • Bộ giải quyết đối số (Argument Resolver) hoạt động sau bộ chặn và trả về đối tượng mong muốn từ các giá trị trong yêu cầu khi có yêu cầu đến Controller.
  • Ngược lại, bộ chặn sẽ chặn yêu cầu trước khi Controller thực thi và không thể trả về bất kỳ đối tượng nào. Nó chỉ có thể trả về boolean hoặc void.


Nguồn tham khảo


Câu hỏi phỏng vấn dự kiến và câu trả lời

Bộ lọc là gì?

Bộ lọc là một tính năng cho phép xử lý các tác vụ bổ sung cho tất cả các yêu cầu phù hợp với mẫu URL trước/sau khi yêu cầu được chuyển đến Dispatcher Servlet và hoạt động ở cấp độ container servlet.


Khi nào nên sử dụng bộ lọc?

Bộ lọc có thể xử lý các tác vụ toàn cục không liên quan đến Spring. Hoặc, nó được sử dụng để xác thực tham số yêu cầu.

Cụ thể, nó xử lý các tác vụ chung liên quan đến bảo mật, ghi nhật ký cho tất cả các yêu cầu, nén hình ảnh/dữ liệu và mã hóa chuỗi, cũng như tùy chỉnh ServletRequest.


Bộ chặn là gì?

Bộ chặn là một tính năng cho phép tham chiếu hoặc xử lý yêu cầu và phản hồi trước và sau khi Dispatcher Servlet gọi Controller và hoạt động ở cấp độ Spring container.


Khi nào nên sử dụng bộ chặn?

Bộ chặn có thể xử lý các tác vụ toàn cục liên quan đến yêu cầu của client và thường được sử dụng khi cần xác thực và gọi logic dịch vụ.

Cụ thể, nó xử lý các tác vụ chung như xác thực/ủy quyền, ghi nhật ký cho các cuộc gọi API, và xử lý dữ liệu được chuyển đến Controller.


Sự khác biệt giữa bộ lọc và bộ chặn là gì?

Bộ lọc được thực thi trong container servlet, trong khi bộ chặn được thực thi trong container Spring.

Bộ lọc có thể xử lý trước và sau Dispatcher Servlet, trong khi bộ chặn có thể xử lý trước và sau Controller.

Do đó, bộ lọc nên được sử dụng khi cần xử lý các tác vụ toàn cục không liên quan đến Spring, còn bộ chặn nên được sử dụng khi cần xử lý các tác vụ toàn cục liên quan đến yêu cầu của client.


Bộ giải quyết đối số là gì?

Bộ giải quyết đối số là một tính năng cho phép tạo ra các đối tượng mong muốn từ các giá trị trong yêu cầu khi có yêu cầu đến Controller.


Khi nào nên sử dụng Bộ giải quyết đối số?

Ví dụ, khi có một yêu cầu với token JWT, bạn có thể sử dụng Bộ giải quyết đối số để xác thực token và trích xuất id được lưu trữ trong token để tạo ra đối tượng LoginMember.


Sự khác biệt giữa bộ chặn và Bộ giải quyết đối số là gì?

Bộ giải quyết đối số trả về đối tượng mong muốn từ các giá trị trong yêu cầu khi có yêu cầu đến Controller. Ngược lại, bộ chặn không thể trả về bất kỳ đối tượng nào và Bộ giải quyết đối số được thực thi sau khi bộ chặn hoàn thành.

Bình luận0

[Phi chuyên ngành, trở thành Developer] 14. Tóm tắt những câu hỏi kỹ thuật thường gặp trong phỏng vấn tuyển dụng Developer mớiBài viết này tóm tắt những câu hỏi kỹ thuật thường gặp trong phỏng vấn tuyển dụng Developer mới (vùng nhớ, cấu trúc dữ liệu, cơ sở dữ liệu, v.v.). Hy vọng bài viết sẽ giúp ích cho quá trình chuẩn bị phỏng vấn của bạn.
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

April 3, 2024