1. JNDI概述
应用程序必须能在不知道外部信息是如何命名和组织在其运行环境中的情况下来存取资源和外部信息,JNDI命名上下文和Java语言的注释提供了这种能力
JNDI和注释(Annotation)是存取外部资源和信息的机制
应用程序在运行环境中查找的资源(如数据源、Servlet、EJB)和外部信息必须在命名服务中注册,否则无法找到
用一个有意义的文本名与对象关联。通过分布式系统的命名和目录服务能够对分布式系统中的资源(文件、分布式对象、服务)进行方便的访问和管理
JNDI是Java EE中的核心技术之一,它允许组件定位其他组件和资源,提供了企业级应用所需要的资源和外部信息的注册、存储以及获取组件等功能,许多J2EE组件的使用需要JNDI 的支持
在JMS、JMail、JDBC、EJB等技术中,大量应用这种技术
例如,要定位JDBC资源,企业bean调用JNDI的lookup方法,lookup方法传递一个JNDI名称参数,返回相关的对象
JDBC对每个数据库有独立的驱动程序,JNDI的思想是提供一个通用的接口。底层的名字服务实现可以是各种类型,JNDI通过SPI实现代码屏蔽了各种名字和目录服务实现的区别
1.这个是遍历目录下的文件例子:
package liu;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.NamingEnumeration;
import javax.naming.NameClassPair;
//例中使用Context.list(),返回NameClassPair的一个枚举类型的集合。每个NameClassPair由对象的名字和它的类名组成
public class List {
public static void main(String[] args) {
Hashtable env = new Hashtable(11);
//设置JNDI工厂类,指明Service provider是文件系统.
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
//设置JNDI文件路径
env.put(Context.PROVIDER_URL, "file:/c:/"); // 操作相对程序运行的盘的根目录
try {
Context ctx = new InitialContext(env);
//初始化上下文
NamingEnumeration list = ctx.list("Program Files");
while (list.hasMore()) {
NameClassPair ne = (NameClassPair) list.next();
System.out.println(ne);
}
ctx.close();
} catch (NamingException e) {
System.err.println("List failed: " + e);
}
}
}
2.查找文件并读取内容:
命令行参数作为名字来查找一个对象
使用文件系统的服务提供者,用户向程序提供的名字必须是一个文件名
用户不了解服务提供者的细节
步骤
1.引入JNDI类 Context、InitialContext、NamingException
2.创建初始上下文空间
3.通过上下文查找对象 Object obj=ctx.lookup()
4.捕获异常
package liu;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
public class TestDB {
public static void main(String[] args) throws IOException {
try {
Hashtable env = new Hashtable();
// 设置JNDI工厂类,指明Service provider是文件系统.
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
// 设置JNDI文件路径
env.put(Context.PROVIDER_URL, "file:/c:/");
// 初始化上下文
Context ctx = new InitialContext(env);
// 循环显示在JNDI中的所有资源名与类型
NamingEnumeration list = ctx.list("/");
while (list.hasMore()) {
NameClassPair nc = (NameClassPair) list.next();
System.out.println(nc);
}
// 查找文件
File file = (File) ctx.lookup("aaa.txt");
// 读取文件
BufferedReader bw = new BufferedReader(new FileReader(file));
String line = bw.readLine();
while (line != null) {
System.out.println(line);
line = bw.readLine();
}
} catch (NamingException e) {
e.printStackTrace();
}
}
}
3.创建文件:
package liu;
import java.util.Hashtable;
import java.io.File;
import javax.naming.*;
public class Create {
public static void main(String[] args) {
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/c:/");
try {
Context ctx = new InitialContext(env);
Context result = ctx.createSubcontext("new1");
NamingEnumeration list = ctx.list("");
while (list.hasMore()) {
NameClassPair ne = (NameClassPair) list.next();
System.out.println(ne);
}
ctx.close();
} catch (NamingException e) {
System.err.println("List failed: " + e);
}
}
}
4.撤销文件:
package liu;
import java.util.Hashtable;
import java.io.File;
import javax.naming.*;
public class Destroy {
public static void main(String[] args) {
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/c:/");
try {
Context ctx = new InitialContext(env);
ctx.destroySubcontext("new1");
ctx.close();
} catch (NamingException e) {
System.err.println("List failed: " + e);
}
}
}
分享到:
相关推荐
log4j\c3p0\jndi详细配置实例
经过实践归纳的,参考了tomcat6.0关于配置JNDI的官方文档。经过测试可以配置成功和使用。
把文件用weblogic部署上去,然后反编译jar中的bind类 执行主方法weblogic就有打印出hello ejb的字样了,很好的一个ejb实例。
jndi对数据库操作 数据源对数据库操作 最简单的java
Tomcat6.0 JNDI数据源经典实例,里面JAR包,配置文件,数据源都配置好了,sql语句已经打包好了,直接可以建表的。
JNDI学习总结,JNDI配置数据源,资料详细,适合初学者
基于JNDI的应用程序开发 在以TOMCAT为WEB服务器的项目中,用JNDI建立数据库连接池实例.
tomcat配置jndi、数据库连接jndi、jndi实例、非常简单,可以快速学习入门。有连接数据库的例子,和具体的配置。
NULL 博文链接:https://ginge.iteye.com/blog/311296
JNDI服务利用工具 RMI/LDAP,支持部分场景回显、内存shell,高版本JDK场景下利用等,fastjson rce命令执行,log4j rce命令执行 漏洞检测辅助工具
简单我tomcat5.0中的JNDI应用
JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试项目JNDI测试...
hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+tomcat 5.5.x(配置jndi)hibernate 3.1+...
配置了tomcat之后发现jndi好简单啊,可是碰到了hibernate该怎么做呢,本例详细解析
jboss配置MySql的JNDI
jndi获取数据库连接,当前软件版本...Tomcat 为每个在其上运行的 Web 应用都提供了一个 JNDI 的 InitialContext 实现实例 Tomcat中的默认数据源支持基于Commons 项目中的DBCP 1.x连接池,也可以使用实现任何其他连接池
在JAVA编程中对JNDI的支持.是一个开放的源码.
java asm jndi_JNDI-Injection-Exploit,用于log4j2漏洞验证 可执行程序为jar包,在命令行中运行以下命令: $ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] 其中: -C ...
自定义jndi数据源factory类,用于解密jndi中的加密数据,解密方式为DES,具体可根据实际需求修改。
jndi入门学习资料,介绍jndi基本原理,安装和使用,基本配置