[Design Patterns] Intercepting Filter

Intercepting Filter (màng chắn) được sử dụng khi chúng ta muốn thực hiện các thao tác tiền xử lý / hậu xử lý với các yêu cầu request hoặc phản hồi response của ứng dụng. Các filter được định nghĩa và áp dụng lên các request trước khi chuyển tới lớp xử lý chính hoặc

Intercepting Filter (màng chắn) được sử dụng khi chúng ta muốn thực hiện các thao tác tiền xử lý / hậu xử lý với các yêu cầu request hoặc phản hồi response của ứng dụng. Các filter được định nghĩa và áp dụng lên các request trước khi chuyển tới lớp xử lý chính hoặc các response trước khi chuyển tới máy khách client. Các filter có thể thực hiện các chức năng như xác thực đăng nhập / ghi nhật ký / hoặc theo dõi các request, rồi sau đó chuyển các request tới lớp xử lý tương ứng. Sau đây là các thành phần có mặt trong pattern:

  • Client – object gửi yêu cầu request tới Target hoặc nhận response.
  • Target – object xử lý request hoặc response.
  • Filter – thực hiện các tác vụ trước hoặc sau xử lý request hoặc response.
  • Filter Chain – chứa một bộ các Filter giúp chúng ta thực hiện theo thứ tự.
  • Filter Manager – quản lý các Filter và cả Filter Chain.

Áp dụng triển khai

  • Chúng ta sẽ tạo ra một Client để gửi requestTarget để xử lý.
  • Sau đó thêm FilterManager cho Target để bổ sung các Filter tiền xử lý cho các request.

Ở đây với một ví dụ đơn giản thì chúng ta sẽ không tách filterChain thành một class riêng mà có thể sử dụng giao diện List có sẵn. Cách thêm các Filter tiền xử lý cho response cũng tương tự.

Bước 1

Tạo ClientTarget.

interceptingfilter/Client.java

packageinterceptingfilter;publicclassClient{privateTarget target;publicvoidsetTarget(Target target){this.target = target;}publicvoidsendRequest(String request){
      target.processRequest(request);}}

interceptingfilter/Target.java

packageinterceptingfilter;publicclassTarget{privateFilterManager filterManager;publicvoidsetFilterManager(FilterManager filterManager){this.filterManager = filterManager;}publicvoidprocessRequest(String request){
      filterManager.processRequest(request);System.out.println("Processing request: "+ request);}}

Bước 2

Tạo FilterManager để thêm các Filter cho Target.

interceptingfilter/FilterManager.java

packageinterceptingfilter;importinterceptingfilter.filter.AuthenticationFilter;importinterceptingfilter.filter.DebugFilter;importinterceptingfilter.filter.Filter;importjava.util.ArrayList;importjava.util.List;publicclassFilterManager{privateList<Filter> filterChain =newArrayList<Filter>();publicFilterManager(){
      filterChain.add(newAuthenticationFilter());
      filterChain.add(newDebugFilter());}voidsetFilter(Filter filter){
      filterChain.add(filter);}voidprocessRequest(String request){
      filterChain.forEach((filter)-> filter.process(request));}}

Bước 3

Tạo interface Filter và các class triển khai tiền xử lý request.

interceptingfilter/filter/Filter.java

packageinterceptingfilter.filter;publicinterfaceFilter{voidprocess(String request);}

interceptingfilter/filter/AuthenticationFilter.java

packageinterceptingfilter.filter;publicclassAuthenticationFilterimplementsFilter{@Overridepublicvoidprocess(String request){System.out.println("Authenticating request: "+ request);}}

interceptingfilter/filter/DebugFilter.java

packageinterceptingfilter.filter;publicclassDebugFilterimplementsFilter{@Overridepublicvoidprocess(String request){System.out.println("Request log: "+ request);}}

Bước 4

Sử dụng ClientTarget để thử hoạt động của pattern.

PatternDemo.java

importinterceptingfilter.Client;importinterceptingfilter.FilterManager;importinterceptingfilter.Target;importinterceptingfilter.filter.AuthenticationFilter;importinterceptingfilter.filter.DebugFilter;importinterceptingfilter.filter.Filter;publicclassPatternDemo{publicstaticvoidmain(String[] args){FilterManager fm =newFilterManager();Filter authFilter =newAuthenticationFilter();Filter debugFilter =newDebugFilter();
      fm.setFilter(authFilter);
      fm.setFilter(debugFilter);Target target =newTarget();
      target.setFilterManager(fm);Client client =newClient();
      client.setTarget(target);
      client.sendRequest("Home");}}

Bước 5

Kiểm chứng lại kết quả được in ra ở console.

Authenticating request: Home
Request log: Home
Processing request: Home

Nguồn: viblo.asia

Bài viết liên quan

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con

Khi nào nên dùng main, section, article, header, footer, và aside trong HTML5

HTML5 đã giới thiệu các thẻ ngữ nghĩa giúp cấu trúc nội dung web một cách có

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th