Middleware là gì? Vai trò và cách tạo middleware tùy biến

Đã kiểm duyệt nội dung
Đánh giá
Middleware là lớp trung gian nằm giữa client và server hoặc giữa các thành phần trong ứng dụng, có nhiệm vụ xử lý dữ liệu, kiểm soát luồng request/response trước khi logic chính được thực thi. Nhờ middleware, bạn có thể tái sử dụng code hiệu quả, tăng cường bảo mật, kiểm soát truy cập, logging và tối ưu luồng xử lý mà không làm rối cấu trúc hệ thống. Trong bài viết này, mình sẽ cùng bạn tìm hiểu vai trò thực tế của nó trong ứng dụng và cách tạo middleware tùy biến một cách dễ hiểu, áp dụng được ngay.
Những điểm chính
- Khái niệm middleware: Giúp bạn hiểu middleware là đoạn code trung gian xử lý các request và response trong ứng dụng, cho phép can thiệp hoặc chuyển tiếp giữa các thành phần.
- Ứng dụng middleware: Cung cấp thông tin về vai trò thực tế của middleware trong các framework hiện đại, ví dụ giúp kiểm soát truy cập bảo vệ khu vực quản trị.
- Phân loại middleware: Trình bày bốn loại middleware chính để bạn nhận biết từng loại phục vụ mục đích gì trong hệ thống.
- Cách thức hoạt động: Mô tả quy trình các middleware phối hợp chuyển tiếp, xử lý và trả lại request/response đồng thời cho biết bạn có thể chủ động dừng quá trình này ở bất kỳ bước nào.
- Cách tạo middleware tuỳ biến: Hướng dẫn cách tạo middleware để xử lý các trường hợp đặc biệt, ví dụ chuyển hướng người dùng theo thiết bị giúp tối ưu trải nghiệm truy cập.
- Cách dùng middleware trong GIN Golang: Hướng dẫn các cách dùng middleware trong GIN Golang như cho tất cả request, cho một group, cho từng URL cụ thể,…
- Cách dùng middleware trong .NET CORE: Hướng dẫn cách dùng middleware trong .NET CORE thông qua các câu lệnh.
- Biết thêm Vietnix là nhà cung cấp dịch vụ Enterprise Cloud chất lượng cao dành cho doanh nghiệp.
- Câu hỏi thường gặp: Trả lời các câu hỏi liên quan đến middleware.

Middleware là gì?
Middleware là những đoạn code được đặt ở giữa quá trình xử lý các request và response của ứng dụng. Khi có một request gửi đến, middleware sẽ tiếp nhận, thực hiện các thao tác cần thiết trên request đó. Sau khi xử lý xong, middleware có thể trả về kết quả (response) hoặc chuyển tiếp request sang middleware tiếp theo trong chuỗi xử lý để tiếp tục thực hiện các nhiệm vụ khác.

Khi hạ tầng công nghệ được mở rộng, doanh nghiệp nên cân nhắc sử dụng dịch vụ Enterprise Cloud để chủ động kiểm soát tài nguyên, nâng cao hiệu năng và tối ưu chi phí vận hành. Với mô hình này, bạn sở hữu một cụm tài nguyên riêng biệt, toàn quyền khởi tạo và quản lý nhiều VPS, dễ dàng mở rộng khi lưu lượng truy cập tăng hoặc khi cần thêm môi trường chạy ứng dụng mới. Đây là lựa chọn phù hợp cho các hệ thống cần tính ổn định cao, bảo mật tốt và khả năng mở rộng linh hoạt thay vì phải thuê lẻ từng VPS hoặc đầu tư hạ tầng vật lý tốn kém.

Ứng dụng middleware
Ngày nay, hầu hết các Web Framework hiện đại đều tích hợp middleware như một phần thiết yếu để kết nối các thành phần trong ứng dụng. Middleware đóng vai trò quan trọng giúp giảm bớt số lượng code phải viết và tối ưu hóa quy trình phát triển web. Một ví dụ thực tế cho việc sử dụng middleware là kiểm soát truy cập. Các trang quản trị chỉ dành riêng cho admin sẽ được bảo vệ bởi middleware nhằm đảm bảo người dùng thông thường không thể truy cập vào các khu vực này.

Phân loại middleware
Phần mềm middleware có thể được chia thành 4 loại chính:
- Transactional: Đảm nhận việc xử lý các giao dịch đồng bộ hoặc bất đồng bộ từ một nhóm yêu cầu ở các hệ thống phân tán như giao dịch ngân hàng hoặc thanh toán thẻ tín dụng.
- Message-oriented: Áp dụng cho các kiến trúc message queue và truyền tải tin nhắn, hỗ trợ giao tiếp giữa các hệ thống với cả hai hình thức đồng bộ và bất đồng bộ.
- Procedural: Dùng trong các kết nối từ xa (remote) và cục bộ (local) nhằm truyền nhận và truy xuất phản hồi giữa các hoạt động giao tiếp hệ thống không đồng bộ.
- Object-oriented: Tương tự Procedural nhưng sẽ kết hợp thêm các nguyên tắc thiết kế lập trình đối tượng như tham chiếu đối tượng, xử lý ngoại lệ (exceptions) và kế thừa thuộc tính thông qua các yêu cầu từ các đối tượng phân tán.

Cách thức hoạt động của middleware
Khi có HTTP request gửi đến, Kestrel web server sẽ nhận lấy, khởi tạo một HttpContext và chuyển đến middleware đầu tiên trong chuỗi xử lý (pipeline). Mỗi middleware sẽ nhận request, xử lý và chuyển tiếp cho middleware tiếp theo. Quá trình này sẽ tiếp diễn cho đến middleware cuối cùng tùy thuộc vào số lượng middleware mà bạn thiết lập.
Khi đến middleware cuối cùng, request sẽ được trả ngược lại qua từng middleware trước đó, cho phép mỗi middleware có cơ hội kiểm tra lại request và tinh chỉnh response trước khi trả về client thông qua Kestrel. Đặc biệt, bất cứ middleware nào trong pipeline cũng có thể chủ động ngắt quá trình này chỉ bằng cách không tiếp tục chuyển request sang bước tiếp theo.

Cách tạo middleware tùy biến
Một ví dụ thực tiễn khi sử dụng middleware là việc tự động chuyển hướng người dùng truy cập website từ thiết bị di động sang một miền phụ dành riêng cho mobile, mà vẫn giữ nguyên các thông số truy vấn ban đầu. Mặc dù các trang web hiện nay đa phần đã có thiết kế responsive, tuy nhiên việc sử dụng phiên bản mobile riêng biệt giúp tối ưu tốc độ và trải nghiệm.
Bước 1: Bạn tạo project Laravel để test middleware bằng lệnh sau:
composer create-project laravel/laravel middleware-test
cd middleware-test
Bước 2: Với middleware tuỳ chỉnh này, hệ thống sẽ kiểm tra user agent của yêu cầu truy cập. Nếu xác định người dùng đang sử dụng thiết bị di động, middleware sẽ tự động chuyển hướng tới URL mobile phù hợp, đảm bảo người dùng truy cập đúng phiên bản website tối ưu nhất cho thiết bị của mình. Cùng với đó, bạn sẽ chạy lệnh sau để tạo một template middleware MobileRedirect:
php artisan make:middleware MobileRedirect
Bước 3: Tiếp theo, bạn sẽ tạo một file app/Http/Middleware/MobileRedirect.php với các lệnh dưới đây:
<?php
namespace AppHttpMiddleware;
use Closure;
class MobileRedirect
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}Việc triển khai phương thức handle sẽ dựa trên cấu trúc của middleware trong framework và đây là nơi bạn xây dựng logic chính cho middleware đó. Laravel hỗ trợ hai loại middleware: before middleware và after middleware. Before middleware được thực thi trước khi yêu cầu được xử lý và phản hồi được tạo ra, còn after middleware chạy sau khi ứng dụng đã xử lý xong yêu cầu và phản hồi đã sẵn sàng.

Bước 4: Khi cần chuyển hướng người dùng trước khi yêu cầu được xử lý, bạn nên sử dụng before middleware để đảm bảo việc chuyển hướng diễn ra đúng thời điểm, giúp tối ưu luồng xử lý. Bạn có thể tiếp tục chỉnh sửa file app/Http/Middleware/MobileRedirect.php để triển khai logic kiểm tra và chuyển hướng phù hợp cho middleware này như sau:
<?php
namespace App\Http\Middleware;
use Closure;
class MobileRedirect
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// check nếu request từ thiết bị di động
if ($request->mobile == "1") {
return redirect('mobile-site-url');
}
return $next($request);
}
}Bước 5: Middleware sẽ kiểm tra xem tham số mobile có tồn tại và có giá trị TRUE hay không. Nếu đúng, người dùng sẽ được tự động chuyển hướng đến phiên bản website dành cho thiết bị di động. Ngay lúc này, bạn cần dùng một thư viện user agent để lấy thông tin user của client.

Bước 6: Sau khi kiểm tra và thực hiện chuyển hướng (nếu cần), hàm $next($request) sẽ được gọi để tiếp tục xử lý yêu cầu. Việc đặt logic kiểm tra thiết bị di động trước khi gọi $next($request) chính là một before middleware và chúng giúp xử lý, chuyển hướng người dùng ở bước đầu quy trình request. Tiếp theo, bạn cần tạo một after middleware để xử lý các yêu cầu trên.
php artisan make:middleware CustomMiddleWare
vi app/Http/Middleware/CustomMiddleWare.php<?php
namespace App\Http\Middleware;
use Closure;
class CustomMiddleWare
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
/* Viết logic code ở đây nha */
return $response;
}
}
Bước 7: Sau khi hoàn thiện logic cho middleware tùy chỉnh, bạn cần đăng ký middleware này trong Laravel để có thể kiểm thử thực tế. Để thực hiện, bạn hãy mở file app/Http/Kernel.php và thêm middleware vào mảng cấu hình để framework nhận diện và kích hoạt middleware khi xử lý các request.
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
IlluminateFoundationHttpMiddlewareValidatePostSize::class,
AppHttpMiddlewareTrimStrings::class,
IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
];Bước 8: Sau đó, bạn chỉ cần thêm middleware tuỳ chỉnh vừa tạo vào mảng cấu hình trong file Kernel.php như sau:
protected $middleware = [
IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
IlluminateFoundationHttpMiddlewareValidatePostSize::class,
AppHttpMiddlewareTrimStrings::class,
IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
AppHttpMiddlewareMobileRedirect::class,
];
Bước 9: Sau khi đã thêm middleware vào cấu hình, bạn có thể thử truy cập bất kỳ route nào trên Laravel với chuỗi truy vấn mobile=1 để kiểm tra hoạt động của middleware vừa đăng ký. Nếu chỉ muốn áp dụng middleware cho một số route cụ thể, bạn có thể sử dụng $routeMiddleware để linh hoạt phạm vi cấu hình áp dụng cho middleware đó.

Cách dùng middleware trong GIN Golang
Trong GIN Golang, có một số cách sử dụng middleware:
1. Dành cho tất cả request hay toàn bộ application
//...
func main() {
router := gin.New()
router.Use(logger())
router.Run()
}
//...Với cách cấu hình này, tất cả request sẽ được xử lý lần lượt bởi middleware logger.
2. Dành cho một group
//...
func main() {
router := gin.New()
v1 := router.Group("/v1", logger())
router.Run()
}
//...Với cấu hình này, mọi request đến các endpoint dưới đường dẫn /v1/ đều sẽ được xử lý thông qua middleware logger.
3. Dành cho từng URL cụ thể
//...
func main() {
router := gin.New()
router.GET("/ping", logger(), func(c *gin.Context) {
c.JSON(200, gin.H{"data": "pong"})
})
router.Run()
}
//...Middleware này chỉ được áp dụng cho endpoint GET /ping.
4. Phối hợp liên tục các middleware với nhau
//...
func main() {
router := gin.New()
router.GET("/ping", logger(), logger(), logger(), func(c *gin.Context) {
c.JSON(200, gin.H{"data": "pong"})
})
router.Run()
}
//...Trên thực tế, bạn có thể kết hợp nhiều middleware với nhau mà không giới hạn về số lượng để triển khai các logic xử lý phức tạp hơn.
Cách dùng middleware trong .NET CORE
Để sử dụng và tùy chỉnh một middleware trong .NET Core, bạn cần đáp ứng hai yêu cầu sau:
- Class middleware phải có constructor public với ít nhất một tham số kiểu RequestDelegate. Đây là tham chiếu đến middleware kế tiếp trong pipeline. Khi gọi RequestDelegate này, request sẽ được chuyển tiếp đến middleware tiếp theo.
- Class middleware phải được định nghĩa một method public tên Invoke, nhận tham số HttpContext và trả về Task. Đây là phương thức được thực thi khi có request đi vào middleware.
Sau khi nắm đủ hai điều kiện trên, bạn có thể bắt đầu tạo class middleware tùy chỉnh.
public class CustomeMiddleware
{
private readonly RequestDelegate _next;
public CustomeMiddleware(RequestDelegate next)
{
_next = next;
}
public async System.Threading.Tasks.Task Invoke(HttpContext context)
{
await context.Response.WriteAsync("<div> before - CustomeMiddleware </div>");
await _next(context);
await context.Response.WriteAsync("<div> after - CustomeMiddleware </div>");
}
}Trong constructor, bạn nhận tham chiếu tới middleware kế tiếp trong pipeline và lưu lại trong biến _next để có thể gọi nó khi cần.
public CustomeMiddleware(RequestDelegate next)
{
_next = next;
}Tiếp theo, khai báo phương thức Invoke, bạn nhận vào một đối tượng HttpContext để xử lý request. Trong phương thức này, bạn có thể ghi một số nội dung vào response, sau đó gọi middleware kế tiếp bằng lệnh await _next(context).
public async System.Threading.Tasks.Task Invoke(HttpContext context)
{
await context.Response.WriteAsync("<div> Hello from Simple Middleware </div>");
await _next(context);
await context.Response.WriteAsync("<div> Bye from Simple Middleware </div>");
}Cuối cùng, bạn cần đăng ký middleware vào request pipeline bằng cách sử dụng phương thức UseMiddleware trong file Startup.cs như ví dụ dưới đây:
app.UseMiddleware<SimpleMiddleware>();Vietnix – Nhà cung cấp dịch vụ Enterprise Cloud và S3 Object Storage chất lượng cao cho doanh nghiệp Việt
Vietnix là nhà cung cấp các giải pháp Enterprise Cloud và S3 Object Storage được thiết kế tối ưu cho doanh nghiệp Việt, đáp ứng tốt nhu cầu lưu trữ, xử lý dữ liệu và mở rộng hạ tầng trong môi trường số hiện đại. Với nền tảng vận hành ổn định, khả năng mở rộng linh hoạt và đội ngũ kỹ thuật giàu kinh nghiệm, Vietnix giúp bạn xây dựng hệ thống cloud an toàn, hiệu quả và phù hợp với nhiều mô hình ứng dụng khác nhau. Lựa chọn Vietnix, mình không chỉ tối ưu chi phí đầu tư hạ tầng mà còn đảm bảo hiệu suất và tính sẵn sàng cao cho hệ thống doanh nghiệp!
Thông tin liên hệ:
- Website: https://vietnix.vn/
- Hotline: 1800 1093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh
Câu hỏi thường gặp
Middleware express là gì?
Middleware trong Express là các hàm xử lý trung gian được thực hiện tuần tự trong quá trình xử lý yêu cầu HTTP đến server. Middleware có nhiệm vụ như cầu nối giữa request (yêu cầu từ client) và response (phản hồi từ server).
Những nền tảng nào có thể thực hiện được Middleware?
Middleware có thể thực hiện được trên nhiều nền tảng khác nhau, phổ biến nhất là:
– Các framework lập trình web như Express.js (Node.js), Django (Python), Ruby on Rails (Ruby), Laravel (PHP),…
– Máy chủ ứng dụng web (web application server).
– Các nền tảng phần mềm trung gian (middleware platform) trong kiến trúc doanh nghiệp như API Gateway, Service Mesh, Message Brokers (Kafka, RabbitMQ).
– Các framework/phần mềm middleware đa tầng/phức tạp như Spring Boot, .NET,…
– Trong môi trường cloud và microservices, middleware.
– Hệ thống message-oriented middleware (MOM).
Middleware Spring Boot là gì?
Middleware trong Spring Boot là các thành phần trung gian hoạt động giữa client gửi yêu cầu và server trả phản hồi. Ở Spring Boot, middleware thường được triển khai dưới dạng Filters, Interceptors hoặc Aspect-Oriented Programming (AOP).
Middleware Nodejs là gì?
Trong Node.js, đặc biệt là với Express.js, middleware là các hàm trung gian nằm giữa request từ client và route handler. Chúng được dùng để ghi log, xác thực, xử lý hoặc thay đổi request/response trước khi chuyển tiếp. Thông qua việc nhận vào ba tham số req, res và next() để tiếp tục sang middleware hoặc handler tiếp theo.
Bài viết đã cung cấp cho bạn kiến thức tổng quan về middleware, các loại ứng dụng và cách vận hành hiệu quả. Hy vọng bạn sẽ dễ dàng áp dụng các giải pháp này để nâng cao bảo mật, hiệu suất cho dự án của mình nhờ vào những nền tảng phù hợp. Cảm ơn bạn đã theo dõi bài viết!
THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM
Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày















