用于列出远程计算机上jndi中所有条目的代码

Ana*_*man 46 java jndi

任何人都可以告诉或指出代码列出远程机器中的所有jndi条目

Ste*_*eve 81

可以列出InitialContext的所有条目.您可以使用此代码段:

InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("");
while (list.hasMore()) {
  System.out.println(list.next().getName());
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是应用程序服务器,通常可以选择浏览JNDI树.

  • 这不是tomcat中的完整树.仅限用户在该实例中创建的内容.有没有办法在tomcat上做到这一点? (2认同)

Nic*_*aly 21

之前的答案没有给我"全图"(在Tomcat7上),所以我把以下的合并,将JNDI值转换为树图(带有toString值):

import javax.naming.*;
...

public static Map toMap(Context ctx) throws NamingException {
    String namespace = ctx instanceof InitialContext ? ctx.getNameInNamespace() : "";
    HashMap<String, Object> map = new HashMap<String, Object>();
    log.info("> Listing namespace: " + namespace);
    NamingEnumeration<NameClassPair> list = ctx.list(namespace);
    while (list.hasMoreElements()) {
        NameClassPair next = list.next();
        String name = next.getName();
        String jndiPath = namespace + name;
        Object lookup;
        try {
            log.info("> Looking up name: " + jndiPath);
            Object tmp = ctx.lookup(jndiPath);
            if (tmp instanceof Context) {
                lookup = toMap((Context) tmp);
            } else {
                lookup = tmp.toString();
            }
        } catch (Throwable t) {
            lookup = t.getMessage();
        }
        map.put(name, lookup);

    }
    return map;
}
Run Code Online (Sandbox Code Playgroud)

用法:

toMap(new InitialContext());
Run Code Online (Sandbox Code Playgroud)

在Tomcat7中提供以下输出:

{
  "comp": {
    "env": {
      "myCustomVar": "foobar"
    },
    "UserTransaction": "Cannot create resource instance",
    "Resources": {
      "index.html": "org.apache.naming.resources.FileDirContext$FileResource@32edeea8",
      "WEB-INF": {
        "ibm-web-ext.xml": "org.apache.naming.resources.FileDirContext$FileResource@6132b73b",
        "ibm-web-bnd.xml": "org.apache.naming.resources.FileDirContext$FileResource@22cf71b7"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Vie*_*nko 20

我知道,从上一个答案开始有很多时间,但我需要列出上下文中可用的所有jdbc数据源(tomee context).

就我而言,我需要的不仅仅是list("")(遗憾的是,这对我来说不起作用)才能实现我的目标.我在这里找到了一个命名环境列表:

J2EE应用程序组件的命名环境

有了这个,我使用下一个代码片段获得了所有可用的jdbc资源

InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("java:comp/env/jdbc");
while (list.hasMore()) {
    System.out.println(list.next().getName());
}
Run Code Online (Sandbox Code Playgroud)

就这样.

我希望这可以帮助别人,帮助我.