<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 23,comments - 12,trackbacks - 0
    JNDIjava訪問名字和目錄服務的接口,與JDBC一樣,它僅僅只定義了一套服務接口,實現由具體廠商提供。作為j2ee核心組件之一,它為應用程序查找其他程序組件和資源提供了統一的接口,其中最常見的用途就是數據源的配置、EJB名字查找、JMS相關配置等。JNDI的架構如下圖。在JDK1.3中,已經包含了JNDI,它分成五個包。每個包提供的功能:

    -????????? javax.naming,包含訪問命名服務的類和接口定義。

    -????????? javax.naming.directory,包含訪問目錄服務的類和接口定義。

    -????????? javax.naming.ldap,為ldapv3提供的擴展操作提供支持。

    -????????? javax.naming.event,為訪問命名和目錄服務時的事件通知提供支持。

    -????????? javax.naming.spi,為服務提供商提供的接口,一般用戶不會涉及。

    基本概念

    ?????? 了解名字服務和目錄服務的相關概念,有助于更好的使用JNDI

    Naming service

    ?????? 名字服務定義了如何將名字與對象關聯,并通過名字如何找到對象的方法。典型的例子如:DNS將域名與IP關聯,文件系統將文件名與文件相關聯。在名字服務中,主要的概念:

    -????????? 名字(Names),在名字系統中實際對象的代號,如文件名,域名等,它會被用來查找關聯的對象。不同的系統中會有不同的命名規范,如文件系統采用“\”來表示層級,而DNS則使用“.”。

    -????????? 綁定(Bindings),名字和實際對象的關聯。

    -????????? 引用和地址(References and Addresses),當對象不能直接被存儲在名字系統時,就必須使用引用,通過引用找到實際的對象。在系統中,保存的引用的內容被稱為地址。引用還有另一個用處:在名字系統中,缺少象關系數據庫中外鍵的概念。通過使用引用,可以作為外鍵的一個取代辦法。

    -????????? 上下文(Context),它是一個名字-對象集合,提供了與名字系統交互的主要操作,如查找、綁定、去綁定。子上下文(subcontext)與它的關系類似文件系統中目錄和子目錄的關系,子上下文被包含在一個上下文中,通過父上下文中的一個名字與子上下文關聯。

    -????????? 名字系統和名字空間(Naming Systems and Namespaces),名字系統是相同類型的上下文的集合,它提供名字服務;名字空間,是名字系統中的名字集合,如文件系統的文件名和目錄。

    Directory service

    ?????? 目錄服務是名字服務的擴展,它除了關聯名字和對象,還允許對象包含屬性。目錄系統通常以層次結構組織數據。在目錄服務中的主要概念:

    -????????? 屬性(Attributes),它屬于目錄對象,它是(名字,值)對,屬性可以有多個值。

    -????????? 目錄和目錄服務(Directories and Directory Services),目錄是目錄對象的集合;目錄服務則提供與目錄相關的服務,創建、刪除和修改存放在目錄中的對象的屬性。

    -????????? 查找和查找過濾器(Searches and Search Filters),獲取目錄對象的操作就是查找;過濾器是類似查找條件的對象。

    基本使用

    2??????? 注冊JNDI提供者

    在使用JNDI之前,需要先獲取JNDI的提供者,并在系統注冊它。與JNDI相關的系統屬性在javax.naming.Context中定義,常用的屬性:

    -????????? java.naming.factory.initial,服務提供者用來創建InitialContext的類名。

    -????????? java.naming.provider.url,用來配置InitialContext的初始url

    -????????? java.naming.factory.object,用來創建name-to-object映射的類,用于NameClassPairReferences

    -????????? java.naming.factory.state,用來創建jndi state的類

    對于目錄服務,由于一般需要安全設置,還通常使用:

    -????????? java.naming.security.authentication,安全類型,三個值:nonesimplestrong

    -????????? java.naming.security.principal,認證信息。

    -????????? java.naming.security.credentials,證書信息。

    -????????? java.naming.security.protocol,安全協議名。

    使用System.setProperty注冊,如果程序不顯示說明,那么java會在classpath內查找jdni.properties文件來完成注冊。jdni.properties例子:

    java.naming.factory.initial=com.codeline.db.MockInitialContextFactory

    2??????? 連接服務

    注冊之后,就可以實施服務連接了。對于名字服務由InitialContext開始,目錄服務則使用InitialDirContext。它們分別實現了ContextDirContext,這兩個接口分別對應名字服務和目錄服務的接口,也是JNDI中最重要的兩個接口。

    -????????? 連接名字服務:

    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"

    com.sun.jndi.fscontext.FSContextFactory");

    InitialContext ctx = new InitialContext();

    -????????? 連接目錄服務:

    ?? Hashtable env = new Hashtable();

    ??? env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

    ??? env.put(Context.PROVIDER_URL, "ldap://myserver.com/");

    ??? env.put(Context.SECURITY_AUTHENTICATION, "simple");

    ??? //登錄ldap server需要的用戶名

    ??? env.put(Context.SECURITY_PRINCIPAL, "ldapuser");

    ??? //登錄ldap server需要的密碼

    ??? env.put(Context.SECURITY_CREDENTIALS, "mypassword");

    InitialDirContext ctx = new InitialDirContext(env);

    -????????? 多服務提供者:如果應用包含多個服務提供者,在連接時略有不同。以名字服務為例:

    Hashtable env = new Hashtable();

    env.put(Context.INITIAL_CONTEXT_FACTORY,

    "com.sun.jndi.rmi.registry.RegistryContextFactory");

    env.put(Context.PROVIDER_URL, "rmi://myserver.com:1099");

    //使用不同的構造函數

    InitialContext ctx = new InitialContext(env);

    2??????? 查找對象

    不論名字服務還是目錄服務,都是使用lookup來查找對象的。除了可以使用String作為參數之外,lookup還可使用Name接口作為參數。

    Greeter greeter = (Greeter)ctx.lookup("SayHello");

    如果想要獲得上下文中所有的對象名字,就使用lis返回NameClassPair列表。NameClassPair包含對象名字和對象類名。如果想要獲得實際的對象實例列表,就使用listBindings,它返回Binding列表。BindingNameClassPair的子類,它包含對象的實例。

    -????????? list

    NamingEnumeration list = ctx.list("awt");

    while (list.hasMore()) {

    ??? NameClassPair nc = (NameClassPair)list.next();

    ??? System.out.println(nc);

    }

    -????????? listBindings

    NamingEnumeration bindings = ctx.listBindings("awt");

    while (bindings.hasMore()) {

    ??? Binding bd = (Binding)bindings.next();

    ??? System.out.println(bd.getName() + ": " + bd.getObject());

    }

    2??????? 對象綁定

    -????????? 使用bind添加綁定

    Fruit fruit = new Fruit("orange");

    ctx.bind("favorite", fruit);

    -????????? 使用rebind修改綁定

    Fruit fruit = new Fruit("lemon");

    ctx.rebind("favorite", fruit);

    -????????? 使用unbind去除綁定。

    ctx.unbind("favorite");

    2??????? 對象改名

    使用rename可以給一個在上下文中的對象改名

    ctx.rename("report.txt", "old_report.txt");

    2??????? 獲取屬性

    屬性相關的接口是AttributeAttributes,它們都在javax.naming.directory包內。通過DirContextgetAttributes方法就可以獲得對象的屬性集合,然后使用Attributesget方法獲得對應的屬性,最后通過Attributeget方法就可以獲得屬性值。

    String dn = "uid=me, dc=mycompany, dc=com, ou=customer, o=ExampleApp";

    Context user = (Context)ctx.lookup(dn);

    //獲得所有屬性

    Attributes attrs = user.getAttributes("");

    Attribute test= attrs .get("test");

    Object testValue= test.get();

    上例中獲得的是user的所有屬性,在實際使用過程中,考慮網絡帶寬的影響,可以設置獲取要獲取的屬性列表:

    String reqd_attrs = new String[] { "surname", "initials","title", "rfc822mailalias"};

    Attributes attrs = user.getAttributes("", reqd_attrs);

    2??????? 查找和過濾

    使用search方法完成。

    ?? public DirContext[] findUser(String initials,String surname,String country,String phone) {

    ??????? //構造條件

    ??????? BasicAttributes search_attrs = new BasicAttributes();

    ??????? search_attrs.put("initials", initials);

    ??????? search_attrs.put("sn", surname);

    ??????? search_attrs.put("c", country);

    ??????? if(phone != null)

    ???????? ?search_attrs.put("phonenumber", phone);

    ?

    ??????? NamingEnumeration results = initial_ctx.search("ou=Customer,o=ExampleApp", search_attrs);

    ??????? LinkedList found = new LinkedList();

    ??????? while(results.hasMore()) {

    ??????????? SearchResults sr = (SearchResults)results.next();

    ??????????? String name = sr.getName();

    ?????? ?????Object ctx = sr.getObject();

    ??????????? if((ctx == null) || !(ctx instanceof DirContext))

    ??????????????? found.add(initial_ctx.lookup(name));

    ??????????? else

    ??????????????? found.add(ctx);

    ??????? }

    ?

    ??????? DirContext[] ret_val = new DirContext[found.size()];

    ??????? found.toArray(ret_val);

    ??????? return ret_val;

    ?? }

    DirContext接口主要過濾方式:

    1.使用過濾字符串

    String reqd_attrs = new String[] { "cn", "uid","rfc822mailalias" };

    NamingEnumeration results = initial_ctx.search("ou=Customer, o=ExampleApp",search_attrs,reqd_attrs);

    2.使用SearchControls,獲得更多的控制

    SearchControls ctrls = new SearchControls();

    ctrls.setCountLimit(20);

    ctrls.setTimeLimit(5000);

    ctrls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    NamingEnumeration results = initial_ctx.search("cat=books,ou=Products,

    o=ExampleApp","title=*Java*",ctrls);

    2??????? 修改屬性

    使用DirContextInitialDirContextmodifyAttributes方法完成。所謂的修改過程,實際就是先構造要修改的屬性列表,然后使用上述方法提交。對于屬性包含多個值時,需要把屬性的不修改的值也要包含,否則服務器會認為那些值不再需要而刪除它們。

    public void updateAddress(String dn,String address, String country, String phone) {

    ??????? BasicAttributes mod_attrs = new BasicAttributes();

    ??????? if(address != null)

    ??????????? mod_attrs.put("address", address);

    ??????? if(country != null)

    ??????????? mod_attrs.put("c", country);

    ??????? if(phone != null)

    ??????????? mod_attrs.put("phonenumber", phone);

    ??????? if(mod_attrs.size() != 0)

    ??????????? initial_ctx.modifyAttributes(dn, DirContext.REPLACE_ATTRIBUTE, mod_attrs);

    }

    使用ModificationItem,也可一次進行多個不同的修改操作:

    ModificationItem[] mod_items = new ModificationItems[2];

    Attribute email = new BasicAttribute("rfc822mailalias", new_email);

    ModificationItem email_mod = new ModificationItem(DirContext.ADD_ATTRIBUTE, email);

    Attribute addr = new BasicAttribute("address", address);

    ModificationItem addr_mod = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, addr);

    mod_items[0] = email_mod;

    mod_items[1] = addr_mod;

    initial_ctx.modifyAttributes(dn, mod_items);

    2??????? 創建上下文

    使用createSubcontext方法完成。

    BasicAttributes attrs = new BasicAttributes();

    attrs.put("initials", initials);

    attrs.put("sn", surname);

    attrs.put("rfc822mailalias", email);

    if(address != null)

    ??? attrs.put("address", address);

    if(country != null)

    ??? attrs.put("c", country);

    if(phone != null)

    ??? attrs.put("phonenumber", phone);

    initial_ctx.createSubcontext(dn, attrs);

    2??????? 刪除上下文

    使用destroySubcontext方法完成。

    initial_ctx.destroySubcontext(dn);

    posted on 2005-10-25 17:23 my java 閱讀(660) 評論(0)  編輯  收藏 所屬分類: JNDI
    主站蜘蛛池模板: 一级一片免费视频播放| 无码精品人妻一区二区三区免费看| 亚洲成a人片在线观看天堂无码| 免费精品国自产拍在线播放| 少妇无码一区二区三区免费| 亚洲αv在线精品糸列| 亚洲精品无码久久久久YW| 亚洲午夜电影在线观看| 无人视频免费观看免费视频| 啊v在线免费观看| 亚洲国产精品美女| 久久久受www免费人成| 天天看片天天爽_免费播放| 亚洲AV无码一区二区二三区入口 | 亚洲国产美女在线观看| 一个人免费观看在线视频www| 国产亚洲老熟女视频| 亚洲乱妇老熟女爽到高潮的片 | 国产一级片免费看| 日本特黄特色aa大片免费| 亚洲黄色在线电影| 在线观看免费黄色网址| 亚洲精品美女久久久久99小说| 亚洲国产精品yw在线观看| 全免费a级毛片免费**视频| 亚洲不卡在线观看| 最近新韩国日本免费观看| 亚洲AV无码成人精品区天堂 | 久久aⅴ免费观看| 亚洲AV一二三区成人影片| 国产麻豆剧传媒精品国产免费| 一区二区视频在线免费观看| 亚洲av福利无码无一区二区| 中文字幕视频在线免费观看| 亚洲美免无码中文字幕在线| 曰批免费视频播放在线看片二| 国产福利电影一区二区三区,亚洲国模精品一区 | 亚洲一区AV无码少妇电影| 国产大片91精品免费观看不卡| 免费人成激情视频| 免费在线看污视频|