GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Design pattern Hướng dẫn Java Design Pattern – Intercepting Filter

Hướng dẫn Java Design Pattern – Intercepting Filter

Đăng vào 24/02/2019 . Được đăng bởi GP Coder . 7123 Lượt xem . Toàn màn hình

Nội dung

  • 1 Intercepting Filter Pattern là gì?
  • 2 Cài đặt Intercepting Filter Pattern như thế nào?
  • 3 Lợi ích của Intercepting Filter Pattern là gì?

Intercepting Filter Pattern là gì?

Intercepting filter pattern là một Java EE pattern, được sử dụng khi muốn thực hiện một vài xử lý trước (pre-processing) khi request được ứng dụng đích (target) xử lý hoặc sau (post-processing) khi response được trả về từ target.

Các Filter được định nghĩa và áp dụng trên yêu cầu (request) khi chuyển request đến ứng dụng đích thực tế (target). Các Filter có thể thực hiện xác thực (authentication), ủy quyền (authorization), nén dữ liệu (compressing), ghi nhật ký (logging) hoặc theo dõi yêu cầu (tracking) và sau đó chuyển yêu cầu đến các trình xử lý tương ứng.

Các Filter được thực thi một cách trong suốt, phía client và target không hề biết sự tồn tại của nó.

Cài đặt Intercepting Filter Pattern như thế nào?

Các thành phần tham gia mẫu Intercepting filter pattern:

  • Filter : chịu trách nhiệm thực hiện một vài xử lý trước khi request được target xử lý hoặc sau khi response được trả về từ target.
  • Target : là một đối tượng xử lý lý chính, một trình xử lý yêu cầu.
  • Filter chain : chứa một chuỗi các Filter sẽ được thực hiện trên target theo thứ tự được xác định.
  • Filter manager : quản lý các Filter và Filter Chain.
  • Client : đối tượng gửi request đến target hoặc nhận response từ target.

Ví dụ sử dụng Intercepting Filter Pattern

Giả sử chúng ta có một ứng dụng cần ghi log, xác thực tất cả request đến hệ thống trước khi target xử lý. Chương trình của chúng ta như sau:

 

HttpRequest.java


package com.gpcoder.patterns.other.filter;

import lombok.Data;

@Data
public class HttpRequest {

	private String clientIp;
	private String targetUrl;
}

Filter.java


package com.gpcoder.patterns.other.filter;

public interface Filter {
	void doFilter(HttpRequest request);
}

TrackingFilter.java


package com.gpcoder.patterns.other.filter;

public class TrackingFilter implements Filter {

	@Override
	public void doFilter(HttpRequest request) {
		System.out.println("Tracking request: " + request);
	}
}

AuthenticationFilter.java


package com.gpcoder.patterns.other.filter;

public class AuthenticationFilter implements Filter {

	@Override
	public void doFilter(HttpRequest request) {
		System.out.println("Authenticating request: " + request);
	}
}

Target.java


package com.gpcoder.patterns.other.filter;

public class Target {

	public void execute(HttpRequest request) {
		System.out.println("Executing request: " + request);
	}
}

FilterChain.java


package com.gpcoder.patterns.other.filter;

import java.util.ArrayList;
import java.util.List;

public class FilterChain {

	private List<Filter> filters = new ArrayList<>();

	private Target target;

	public void addFilter(Filter filter) {
		filters.add(filter);
	}

	public void doFilter(HttpRequest request) {
		// Do some pre-processing
		for (Filter filter : filters) {
			filter.doFilter(request);
		}

		// Execute actual processing by target
		target.execute(request);

		// Do some pos-processing
	}

	public void setTarget(Target target) {
		this.target = target;
	}
}

FilterManager.java


package com.gpcoder.patterns.other.filter;

public class FilterManager {

	private FilterChain filterChain;

	public FilterManager(Target target) {
		filterChain = new FilterChain();
		filterChain.setTarget(target);
	}

	public void addFilter(Filter filter) {
		filterChain.addFilter(filter);
	}

	public void filterRequest(HttpRequest request) {
		filterChain.doFilter(request);
	}
}

Client.java


package com.gpcoder.patterns.other.filter;

public class Client {

	private FilterManager filterManager;

	public Client(FilterManager filterManager) {
		this.filterManager = filterManager;
	}

	public void sendRequest(HttpRequest request) {
		filterManager.filterRequest(request);
	}
}

InterceptingFilterPatternExample.java


package com.gpcoder.patterns.other.filter;

public class InterceptingFilterPatternExample {

	public static void main(String[] args) {
		FilterManager filterManager = new FilterManager(new Target());
		filterManager.addFilter(new TrackingFilter());
		filterManager.addFilter(new AuthenticationFilter());

		HttpRequest request = new HttpRequest();
		request.setClientIp("127.0.0.1");
		request.setTargetUrl("/home");

		Client client = new Client(filterManager);
		client.sendRequest(request);
	}
}

Output của chương trình:


Tracking request: HttpRequest(clientIp=127.0.0.1, targetUrl=/home)
Authenticating request: HttpRequest(clientIp=127.0.0.1, targetUrl=/home)
Executing request: HttpRequest(clientIp=127.0.0.1, targetUrl=/home)

Lợi ích của Intercepting Filter Pattern là gì?

  • Có thể thêm một vài xử lý trước hoặc sau khi request, response được target xử lý thực sự.
  • Giảm kết dính giữa các thành phần trong ứng dụng, mỗi filter chịu trách nhiệm một phần riêng.
  • Tăng khả năng tái sử dụng lại.
  • Dễ dàng thêm/ bớt filter mà không ảnh hưởng đến Business Logic.

Tài liệu tham khảo:

  • https://www.tutorialspoint.com/design_pattern/intercepting_filter_pattern.htm
  • https://www.baeldung.com/intercepting-filter-pattern-in-java
  • https://www.oracle.com/technetwork/java/interceptingfilter-142169.html
5.0
10
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Design pattern Được gắn thẻ: Design pattern, Interceptor

Hướng dẫn Java Design Pattern – Transfer Object
Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?

Có thể bạn muốn xem:

  • Hướng dẫn Java Design Pattern – Flyweight (22/11/2018)
  • Hướng dẫn Java Design Pattern – Template Method (07/01/2019)
  • Hướng dẫn Java Design Pattern – Object Pool (08/10/2018)
  • Hướng dẫn Java Design Pattern – Command (07/12/2018)
  • Hướng dẫn Java Design Pattern – Decorator (08/11/2018)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98033 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97681 lượt xem)
  • Giới thiệu Design Patterns (87732 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86400 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83806 lượt xem)

Nội dung bài viết

  • 1 Intercepting Filter Pattern là gì?
  • 2 Cài đặt Intercepting Filter Pattern như thế nào?
  • 3 Lợi ích của Intercepting Filter Pattern là gì?

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link