Tổng quan về JNDI

Một phần của tài liệu Nghiên cứu, ứng dụng và phát triển hệ thống hỗ trợ làm việc nhóm zimbra, tính bản địa hóa, tối ưu mã nguồn và khả năng tích hợp, mở rộng các ứng dụng trong môi trường zimbra cơ sở dữ liệu, LDAP và các giao thức bảo mật qua SSL (Trang 99 - 104)

H. Giới thiệu LDAP và JNDI

2. Tổng quan về JNDI

Giao diện Thư mục và Đặt tên của JavaTM (Java Naming and Directory Interface - JNDI) là một giao diện lập trình ứng dụng (Application Programming Interface - API) chuyên cung cấp chức năng đặt tên và thư mục cho các ứng dụng được viết bởi việc sử dụng ngôn ngữ lập trình JavaTM. Nó được định nghĩa để không phụ thuộc vào bất kỳ sự thực thi của dịch vụ thư mục đặc trưng nào. Vì vậy một sự khác biệt của các thư mục – tạo mới, trộn, và đã triển khai – đều có thể được truy xuất theo cùng một cách.

 Kiến trúc

Giới Thiệu LDAP Kiến trúc JNDI bao gồn một API và một giao diện bộ cung cấp dịch vụ (Service Provider Interface - SPI). Các ứng dụng Java sử dụng JNDI API để truy xuất một sự khác biệt của các dịch vụ đặt tên và thư mục. SPI làm cho một sự khác biệt của các dịch vụ đặt tên và thư mục được nhúng vào trong một cách trong suốt, do đó việc cho phép ứng dụng Java sử dụng JNDI API để truy xuất các dịch vụ của chúng. Xem hình bên dưới.

Hình H-1 : Kiến trúc JNDI

 Đóng gói

JNDI được đưa vào trong bộ Java 2 SDK, v1.3 và các bản phân phối sau này. Nó có giá trị như là một sự mở rộng chuẩn của Java để sử dụng với bộ JDK1.1 và Java 2 SDK, v1.2. Nó mở rộng các nền tảng của v1.1 và v1.2 để cung cấp các chức năng đặt tên và thư mục.

Để sử dụng JNDI, chúng ta phải có các lớp JNDI và một hoặc nhiều các bộ cung cấp dịch vụ. Bản Java 2 SDK, v1.3 bao gồm 3 bộ cung cấp dịch vụ cho các dịch vụ đặt tên/thư mục dưới đây:

o Nghi thức truy cập Thư mục đơn giản (Lightweight Directory Access Protocol – LDAP)

o Kiến trúc trung lập yêu cầu các đối tượng thông dụng (Common Object Request Broker Architecture – CORBA), các dịch vụ đối tượng thông dụng (Common Object Services – COS), dịch vụ đặt tên.

o Đăng ký triệu gọi phương thức từ xa Java (Remote Method Invocation - RMI) Các bộ cung cấp dịch vụ khác có thể được tải về từ website JNDI (http://java.sun.com/products/jndi/serviceproviders.html) hoặc lấy về từ những nhà cung cấp khác. Khi việc sử dụng JNDI trở thành một chuẩn mở rộng dựa trên JDK 1.1 và Java 2 SDK, v1.2, trước hết chúng ta phải tải về các lớp JNDI và một số các bộ cung cấp dịch vụ (http://java.sun.com/products/jndi). Xem phần Những điều cần chuẩn bị để biết thêm chi tiết về cách cài đặt các lớp JNDI và các bộ cung cấp dịch vụ.

 javax.naming

 javax.naming.directory

 javax.naming.event

 javax.naming.ldap

 javax.naming.spi

2.1 Gói Naming

Gói javax.naming chứa các lớp và các giao diện cho việc truy xuất các dịch vụ đặt tên.

2.1.1 Context

Gói javax.naming định nghĩa một giao diện Context, nó là giao diện cốt lõi để tìm kiếm, kết nối/hủy kết nối, đổi tên các đối tượng, tạo và hủy các subcontext.

Toán tử được sử dụng thường nhất là lookup(). Chúng ta cung cấp cho lookup() cái tên của đối tượng cần tìm kiếm, và nó trả về một đối tượng được kết nối đến cái tên ấy. Ví dụ, đoạn code sau tìm kiếm một máy in và gửi một tài liệu đến đối tượng máy in để thực hiện việc in.

Printer printer = (Printer)ctx.lookup("xcio");

printer.print(report);

2.1.2 Names

Mỗi phương thức đặt tên trong giao diện Context đều có 2 hàm thay đổi: một là nhận vào một tham số Name và hai là nhận vào một cái tên kiểu java.lang.String. Name là một giao diện thể hiện một cái name chung – theo một trình tự gồm 0 hoặc nhiều thành phần. Đối với các phương thức trong giao diện Context, một cái tham số Name là một thể hiện của CompositeName đại diện cho một composite name, vì thế chúng ta có thể đặt tên một đối tượng nhờ việc sử dụng một cái tên mở rộng cho nhiều namespace. Một tham số Name thuộc bất kỳ kiểu nào đại diện cho một compound name. (Names được đề cập trong phần Những thắc mắc cơ bản.) Các tham số đưa vào nhận Name rất có ích cho các ứng dụng để vận dụng các name, đó là việc soạn thảo chúng, so sánh các thành phần,…

Một tham số name kiểu java.lang.String thể hiện một composite name. Việc nạp vào các name kiểu java.lang.String được xem là một tiện ích của các trình ứng dụng đơn giản, chẳng hạn như đọc một cái name và tra cứu đối tượng tương ứng.

2.1.3 Các kết nối (Binding)

listBindings() trả về một danh sách các kết nối name-đến-đối tượng. Mỗi kết nối được đại diện bởi một thể hiện của lớp Binding. Một kết nối là một bộ chứa tên kết nối của đối tượng , tên lớp của đối tượng, và tên của chính đối tượng đó.

list() giống như listBindings(), ngoại việc trả về một danh sách các NameClassPair.

NameClassPair chứa tên của một đối tượng và tên lớp của đối tượng. list() giúp cho các ứng dụng chẳng hạn như các trình duyệt nào muốn khám phá thông tin về các đối tượng được kết nối bên trong một context nhưng không cần tất cả về các đối tượng thực. Mặc dù listBindings() cung cấp tất cả các thông tin giống nhau, nó là một toán tử sáng giá một cách tiềm ẩn.

Giới Thiệu LDAP 2.1.4 Các tham chiếu (Reference)

Các đối tượng được lưu trữ trong các dịch vụ đặt tên và thư mục theo nhiều cách khác nhau. Một dịch vụ hỗ trợ việc lưu trữ các đối tượng Java có thể hỗ trợ lưu trữ một đối tượng dưới hình thức tương tự của nó. Tuy nhiên, một vài dịch vụ đặt tên và thư mục không có hỗ trợ việc lưu trữ cho các đối tượng. Hơn nữa, đối với một số đối tượng trong thư mục, các chương trình Java là nhưng không phải là một trong nhóm các ứng dụng truy xuất chúng.

Trong trường hợp này, một đối tượng Java tuyến tính có thể không là một thể hiện thích hợp nhất. Một tham chiếu có thể sẽ rất chính xác cho sự thể hiện của một đối tượng, nơi mà hình thức tương tự của nó có thể chứa nhiều hơn một trạng thái (Xem phần Định nghĩa Naming).

JNDI định nghĩa lớp Reference để thể hiện cho một tham chiếu. Một tham chiếu chứa thông tin làm thế nào để tạo một bản sao chép cho đối tượng. JNDI sẽ cố gắng để chuyển các tham chiếu được tra cứu từ thư mục thành các đối tượng Java mà chúng thể hiện, để JNDI trên phía client có thể hình dung ra được những gì được lưu trữ bên trong thư mục – đó là các đối tượng Java.

2.1.5 Khởi tạo ngữ cảnh (initial context)

Trong JNDI, tất cả các toán tử đặt tên và thư mục đều được thực thi có liên quan đến một context. Không có những nguồn gốc nào cố định cả. Do đó JNDI định nghĩa một initial context, InitialContext, chúng cung cấp một điểm khởi đầu cho các toán tử đặt tên và thư mục. Một lần chúng ta khởi tạo một context, chúng ta có thể sử dụng nó để tra cứu những context và các đối tượng khác.

2.1.6 Các biệt lệ (exception)

JNDI định nghĩa một lớp phân cấp cho các biệt lệ có thể được ném trong phần thực thi các toán tử đặt tên và thư mục. Gốc của lớp phân cấp này là NamingException. Các chương trình cư xử với một biệt lệ riêng biệt có thể bắt các lớp con tương ứng của biệt lệ. Nói cách khác, chúng nên bắt biệt lệ NamingException.

2.2 Gói Directory

Gói javax.naming.directory mở rộng từ gói javax.naming để cung cấp các chức năng truy xuất các dịch vụ thư mục bổ sung cho các dịch vụ đặt tên. Gói này cho phép các ứng dụng lấy về các thuộc tính tương thích với các đối tượng được lưu trữ trong thư mục và để tìm kiếm các đối tượng sử dụng các thuộc tính đã được chỉ định.

2.2.1 Directory Context

Giao diện DirContext thể hiện một directory context. Nó định nghĩa các phương thức cho việc khảo sát và cập nhật các thuộc tính tương ứng với một directory object.

Chúng ta sử dụng getAttributes() để lấy về các thuộc tính tương ứng với một directory object (ứng với cái name mà chúng ta đưa vào). Các thuộc tính được xây dựng bởi hàm modifyAttributes(). Chúng ta có thể thêm, thay thế, hoặc xóa các thuộc tính và/hoặc các giá trị thuộc tính bằng việc sử dụng các toán tử nào.

DirContext cũng có những hành vi như một naming context bằng việc mở rộng giao diện Context. Điều này nghĩa là bất kỳ directory object nào cũng có thể cung cấp một naming context. Ví dun, một directory object cho một người nào đó có thể chứa các thuộc tính về người đó cũng như việc cung cấp một context cho các đối tượng đặt tên, chẳng hạn như các máy in của người đó và hệ thống tập tin có liên quan đến đối tượng thư mục của người đó.

DirContext chứa các phương thức để thực thi việc tìm kiếm nội dung cơ bản của thư mục. Một hình thức đơn giản và thông dụng nhất, trình ứng dụng chỉ định một tập hợp các thuộc tính – có thể chỉ định với các giá trị -- để so khớp và chấp nhận thuộc tính này thiết lập cho phương thức search(). Các hình thức nạp vào search() được hỗ trợ tinh vi hơn bởi bộ lọc tìm kiếm.

2.3 Gói Event

Gói javax.naming.event chứa các lớp và giao diện hỗ trợ thông báo sự kiện trong các dịch vụ đặt tên và thư mục. Thông báo sự kiện được mô tả chi tiết trong phần Những thắc mắc cơ bản.

2.3.1 Events

Một NamingEvent thể hiện một sự kiện được quản lý bởi một dịch vụ đặt tên/thư mục.

Sự kiện chứa một kiểu dùng để nhận biết kiểu của sự kiện. Ví dụ, các kiểu sự kiện được phân loại chúng có ảnh hưởng đến namespace, như là ―đối tượng được thêm vào‖, và chúng không gây ra vấn đề gì cả, như là ―đối tượng được thay đổi‖. Một NamingEvent cũng chứa thông tin khác về sự thay đổi, chẳng hạn như thông tin về đối tượng trước và sau khi thay đổi.

2.3.2 Listeners

Một NamingListener là một đối tượng lắng nghe NamingEvents. Mỗi phân loại của kiểu sự kiện đều có một kiểu NamingListener tương tứng. Ví dụ, một NamespaceChangeListener thể hiện một listener trong namespace làm thay đổi các sự kiện và một ObjectChangeListener thể hiện một listener trong đối tượng làm thay đổi các sự kiện.

Để nhận các thông báo từ sự kiện, một listener phải được đăng ký với một EventContext cũng như với một EventDirContext. Một lần đã đăng ký, listener sẽ nhận các thông báo từ sự kiện khi các thay đổi tương ứng xảy ra trong dịch vụ đặt tên/thư mục.

2.4 Gói LDAP

Gói javax.naming.ldap chứa các lớp và giao diện dành cho việc sử dụng các đặc tính được chỉ định trong LDAP v3 và bản này chưa được thông dụng để đưa vào trong gói javax.naming.directory. Thực tế, hầu hết các ứng dụng JNDI sử dụng LDAP sẽ tìm đến gói javax.naming.directory có đầy đủ khả năng và sẽ không cần thiết để sử dụng gói javax.naming.ldap. Gói này mục đích chính cho các ứng dụng sử dụng khi cần thiết ―mở rộng‖ các toán tử, các điều khiển, hoặc các thông báo tự động.

2.4.1 Toán tử “mở rộng”

Bổ sung cho định nghĩa các toán tử được chỉ định như là tìm kiếm và xây dựng lại, các đặc tả LDAP v3 (RFC 2251) chỉ định một cách để truyền vừa được định nghĩa các toán tử giữa LDAP phía client và server. Các toán tử này được gọi là các toán tử “mở rộng”. Một toán tử ―mở rộng‖ có thể được định nghĩa bởi một tổ chức tiêu chuẩn như Internet Engineering Task Force (IETF) hoặc bởi một nhà cung cấp nào đó. Gói này định nghĩa các lớp về khởi đầu sự mở rộng TLS.

2.4.2 Các điều khiển

LDAP v3 cho phép mọi yêu cầu hoặc hồi đáp được làm tăng lên bởi vừa được định nghĩa những người xây dựng, gọi là control. Một điều khiển gửi một yêu cầu được một request control và một điều khiển gửi một phản hồi là một response control. Một điều khiển có thể được định nghĩa bởi một tổ chức tiêu chuẩn như là IETF hoặc bởi một nhà cung cấp

Giới Thiệu LDAP nào đó. Các điều khiển yêu cầu không nhất thiết phải đi theo cặp, không cần thiết phải có một điều khiển trả lời mỗi khi một điều khiển yêu cầu được gửi, và ngược lại.

2.4.3 Các thông báo tự động

Bổ sung vào kiểu tương tác request/response thông thường giữa client và server, LDAP v3 cũng chỉ định các unsolicited notifications – các thông điệp được gửi từ phía server đến client bất đồng bộ và không cần bất kỳ sự trả lời nào từ phía client.

2.4.4 LDAP Context

Giao diện LdapContext thể hiện một context cho việc thực thi các toán tử ―mở rộng‖, cho việc gửi các điều khiển yêu cầu, và nhận các điều khiển phản hồi. Các ví dụ về cách sử dụng các đặc tính được mô tả trong phần Điều khiển và Mở rộng.

2.5 Gói Cung cấp dịch vụ (Service Provider)

Gói javax.naming.spi cung cấp các phương tiện bởi các nhà phát triển của các nhà dịch vụ đặt tên/thư mục có thể phát triển và móc nối vào sự thực thi của họ để các dịch vụ tương tứng có thể truy xuất từ các ứng dụng sử dụng JNDI.

2.5.1 Kiến trúc lồng ghép

Gói javax.naming.spi cho phép các việc thi công khác nhau được lồng ghép vào một cách linh động. Những sự thi công này bao gồm trong đó initial context và các context có thể được bắt lấy từ initial context.

2.5.2 Hỗ trợ đối tượng Java

Gói javax.naming.spi hỗ trợ các bộ thi công Context.lookup() và các phương thức có liên quan để trả về các đối tượng Java một cách tự nhiên và theo trực giác của lập trình viên Java. Ví dụ, nếu chúng ta tra cứu một tên máy in từ thư mục, kế đến chúng ta mong rằng sẽ nhận được một đối tượng máy tin dựa trên thao tác đó. Sự hỗ trợ này được cung cấp trong hình thức object factories.

Gói này cũng cung cấp sự trợ giúp cho việc làm đảo ngược. Đó là, bộ thi công của Context.bind() và các phương thức liên quan có thể lấy về các đối tượng Java và lưu trữ các đối tượng dưới một dạng có thể lấy được dựa vào dịch vụ đặt tên/thư mục. Những sự hỗ trợ này cung cấp dưới hình thức state factories.

2.5.3 Nhiều hệ thống đặt tên (Liên đoàn)

Các toán tử JNDI cho phép các ứng dụng cung cấp các tên để mở rộng cho các hệ thống đặt tên. Trong tiến trình hoàn thành một toán tử, một bộ cung cấp dịch vụ cần tương tắc với một nhà cung cấp dịch vụ khác, chẳng hạn như thông qua toán tử để được tiếp tục trong hệ thống đặt tên tiếp theo. Gói này cung cấp sự hỗ trợ cho các nhà cung cấp khác nhau để hợp tác hoàn thành các toán tử JNDI.

Một phần của tài liệu Nghiên cứu, ứng dụng và phát triển hệ thống hỗ trợ làm việc nhóm zimbra, tính bản địa hóa, tối ưu mã nguồn và khả năng tích hợp, mở rộng các ứng dụng trong môi trường zimbra cơ sở dữ liệu, LDAP và các giao thức bảo mật qua SSL (Trang 99 - 104)

Tải bản đầy đủ (PDF)

(256 trang)