一、什么是LDAP
LIGHTWEIGHT DIRECTORY ACCESS Protocol轻量级目录访问协议(目录服务)
类似于这样的树型组织结构,通过LDAP协议连接后像文件夹目录一样
LDAP实现:AD域环境
LDAP默认端口:389
二、JNDI是什么?
Java Naming and Directory Interface Java命名和目录接口(命名服务接口)
用于根据名字找到位置、服务、信息、资源、对象等----KeyValue对
基本操作:
1.发布服务(名字和资源的映射):bind()
2.用名字查找资源:lookup()
为什么要使用JNDI?
一般链接数据库时都是使用jdbc进行连接,但是如果要链接其他数据库时再使用jdbc进行连接的话就需要改动大量代码,但是使用JNDI就可以避免这样的链接问题。
JDBC直接连接数据库的弊端
1.参数变动引发URL修改
2.数据库产品切换,驱动包修改
3.连接池参数的调整
下图是JDBC连接数据库的一个结构图
而利用JNDI连接数据库的结构如下图所示:
JNDI因为是一个命名服务,它可连接的资源是多种多样的,不是只有JDBC,还可以是LDAP目录服务、RMI远程方法调用、DNS、XNam、Novell目录服务、CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、DSML v1&v2、NIS等
由此观之,LDAP和JNDI的关系:
通过JNDI的接口传一个名字就能获得LDAP目录服务里面的存储的数据
三、什么是JNDI注入
1.JNDI动态协议转换
env.put(Context.PROVIDER_URL,"ldap://localhost:7389/dc=example,dc=com");
DirContext ctx = new InitialDirContext(env);
ctx.lookup("rmi://localhost:7389/ou=employees,dc=example,dc=com");
明明env设置的时使用的是ldap协议,但是lookup时却是rmi协议,这就叫动态协议转换。
支持自动转换的协议
协议名称 | 协议URL | Context类 |
DNS协议 | dns:// | com.sun.jndi.url.dns.dnsURLContext |
RMI协议 | rmi:// | com.sun.jndi.url.rmi.rmiURLContext |
LDAP协议 | ldap:// | com.sun.jndi.url.ldap.ldapURLContext |
LDAP协议 | ldaps:// | com.sun.jndi.url.ldaps.ldapsURLContextFactory |
IIOP对象请求代理协议 | iiop:// | com.sun.jndi.url.iiop.iiopURLContext |
IIOP对象请求代理协议 | iiopname:// | com.sun.jndi.url.iiopname.iiopnameURLContextFactory |
IIOP对象请求代理协议 | corbaname:// | com.sun.jndi.url.corbaname.corbanameURLContextFactory |
2.JNDI命名引用
1.在LDAP里面可以存储一个外部的资源,叫做命名引用,对应Reference类
比如远程HTTP服务的一个.class文件
2.如果JNDI客户端基于LDAP服务,找不到对应的资源,就去指定的地址请求,如果是命名引用,会把这个文件下载到本地
3.如果下载的.class文件包含无参构造函数或静态方法块,加载的时候就会自动执行
四、什么是RMI
RMI即远程方法调用,是允许运行在一个JAVA虚拟机上的对象调用运行在另外一个远程JAVA虚拟机上的对象的方法。