Dynamic proxy, protection proxy và vườn thú proxy
Ôn lại trước khi học
Giới thiệu
Bài này học proxy đứng giữa để kiểm tra quyền. Hiểu rồi bạn sẽ phân quyền gọn mà ít code.
Kiến thức cần nhớ
Dynamic proxy là gì
- Dynamic proxy là đại diện do hệ thống sinh lúc chạy.
- Bạn chỉ viết 1 bộ xử lý chung, hệ thống tự đúc lớp.
- Ví dụ đời thường: 1 con dấu dùng chung cho nhiều loại đơn.
- Thêm giao diện mới chỉ cần gắn bộ xử lý vào.
Protection proxy phân quyền
- Protection proxy kiểm tra quyền trước mỗi cuộc gọi.
- Chính chủ được sửa thông tin, cấm tự sửa điểm đánh giá.
- Người yêu được sửa đánh giá, cấm sửa thông tin người khác.
- Ví dụ đời thường: lễ tân chỉ cho khách vào phòng của mình.
Vườn thú proxy
Ba loại đã học: Remote (đại diện máy ở xa), Virtual (hoãn tạo đối tượng nặng), Protection (kiểm tra quyền). Sách Head First kể thêm 6 loại:
| Proxy | Việc |
|---|---|
| Firewall | Chặn truy cập mạng từ nguồn không tin cậy |
| Smart Reference | Làm thêm việc mỗi lần truy cập, ví dụ đếm số tham chiếu |
| Caching | Lưu kết quả tốn kém để trả lại nhanh, là một dạng Virtual proxy |
| Synchronization | Cho nhiều luồng truy cập đối tượng an toàn |
| Complexity Hiding | Che hệ phức tạp như Facade, nhưng vẫn kiểm soát truy cập |
| Copy-On-Write | Hoãn sao chép tới khi có người sửa, dạng biến thể của Virtual proxy |
- Ví dụ đời thường: mỗi loại như 1 kiểu bảo vệ khác nhau.
| Cách | Viết tay | Sinh động |
|---|---|---|
| Số lớp | 1 lớp cho 1 giao diện | 1 bộ xử lý cho nhiều giao diện |
| Thêm mới | Viết thêm lớp | Gắn vào là xong |
| Gỡ lỗi | Dễ đọc | Khó hơn vì sinh lúc chạy |
Ví dụ
- Input: chính chủ gọi setRating(10) cho chính mình. Output: bị chặn, điểm giữ nguyên.
- Giải thích: protection proxy cấm tự chấm điểm cho mình.
- Input: người yêu gọi setRating(9). Output: cho qua và lưu thành công.
- Giải thích: đúng vai trò nên được chuyển lời tới hồ sơ thật.
💻 Bài tập
Ngôn ngữ: Java (dùng java.lang.reflect.Proxy) hoặc Python (dùng __getattr__). C++ không có dynamic proxy sẵn. Nộp vào day-123/.
Bài 1: Protection proxy cho hồ sơ hẹn hò
interface Person {
String getName(); String getGender(); String getInterests(); int getGeekRating();
void setName(String n); void setGender(String g); void setInterests(String i); void setGeekRating(int r);
}
| Handler | Được phép | Bị chặn |
|---|---|---|
OwnerInvocationHandler | mọi get, set thông tin của mình | setGeekRating |
NonOwnerInvocationHandler | mọi get, setGeekRating | mọi set khác |
Bị chặn thì ném IllegalAccessException (bọc trong UndeclaredThrowableException với Java).
owner.setInterests("leo núi") -> thành công
owner.setGeekRating(10) -> bị chặn, điểm không đổi
other.setGeekRating(9) -> thành công, điểm trung bình cập nhật
other.setName("X") -> bị chặn
Bài 2: Proxy dùng chung cho nhiều interface
Viết 1 handler LoggingHandler ghi "[time] Interface.method(args) -> result (ms)" và 1 hàm wrap(Object target, Class<?>... interfaces).
Bọc 3 đối tượng khác interface: Person, GumballMachineRemote (ngày 98), WeatherService (ngày 98). Không viết lớp proxy riêng nào.
Bài 3: Vườn thú proxy (nâng cao)
Viết thêm và kết hợp:
CachingHandler: nhớ kết quả các phương thứcgettrong 5 giây.RetryHandler: phương thức ném lỗi mạng thì thử lại tối đa 3 lần.TimingHandler: cảnh báo khi phương thức chạy quá 100 ms.- Chồng
Logging(Retry(Caching(target))). Viết test cho thứ tự: lỗi lần 1, thành công lần 2, lần gọi sau lấy từ cache.
Viết bảng tổng hợp các loại proxy đã học: remote, virtual, protection, caching, logging, retry. Mỗi loại 1 dòng mục đích và 1 ví dụ thật.
✅ Tiêu chí hoàn thành
- Test quyền Bài 1 pass.
- 1 handler bọc được 3 interface khác nhau.
- Test chồng 3 handler đúng thứ tự hành vi.
- Bảng 6 loại proxy.
❓ Câu hỏi ôn tập
- Dynamic proxy khác proxy viết tay ở điểm gì?
- Protection proxy phân quyền chính chủ và người yêu thế nào?
- Kể tên 4 trong 8 loại proxy?
- Khi nào nên dùng proxy động?
🌕 Bạn đã hoàn thành ngày 123. Làm hết bài tập phía trên rồi sang ngày tiếp theo.