nevergiveupzeng

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

jndi 小案例

JNDI就是为JAVA中命名和目录服务定义的JAVA API,是命名服务的抽象机制。在J2EE中,JNDI的目的是用来查找J2EE服务器的注册资源只要该对象在命名服务器上注册过,且你知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。这样你就可以在无需知道对象位置的情况下获取和使用对象。SUN对JNDI只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现

现在我们就可以在main()中启动基于RMI的JNDI服务并且绑一个对象到JNDI上。注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了

在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就需要自己扩展一个。其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。下面是两个使用JNDI的简单例子的代码,可以直接运行。

使用main方法做JNDI的demo时出现NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中了,于是直接new InitialContext()就搞定了。但是在单机环境下,可没有JNDI服务在运行,那就需要手动启动一个JNDI服务。在JDK 5的rt.jar中一共找到了4种SUN自带的JNDI实现:LDAP,CORBA,RMI,DNS。 
这4种JNDI要正常运行还需要底层的相应服务。一般我们没有LDAP或CORBA服务器,也就无法启动这两种JNDI服务,DNS用于查域名的,以后再研究,唯一可以在main()中启动的就是基于RMI的JNDI服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package com.ellen.jndi;
 
import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
 
//在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
class Person implements Remote, Serializable {
 private static final long serialVersionUID = -8592182872966400365L;
 
 private String name;
 private String pass;
 
 public String getName() {
  return name;
 }
 
 public void setName(String name) {
  this.name = name;
 }
 
 public String getPass() {
  return pass;
 }
 
 public void setPass(String pass) {
  this.pass = pass;
 }
 
 public String toString() {
  return "name=" + this.getName() + "&pass=" + this.getPass();
 }
 
}
 
// 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
// 外部扩展,可以内部扩展也可以外部扩展
class RemoteDate extends Date implements Remote {
};
 
public class Demo {
 public static void initDate() throws NamingException, RemoteException {
  // 设置参数
  LocateRegistry.createRegistry(1099);
  System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
  System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
  InitialContext ctx = new InitialContext();
  // 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
  // 内部扩展,可以内部扩展也可以外部扩展
  class RemoteDate extends Date implements Remote {
  }
  ;
  ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
  ctx.close();
 }
 
 public static void initDate2() throws NamingException, RemoteException {
  // 设置参数
  LocateRegistry.createRegistry(1099);
  System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
  System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
  InitialContext ctx = new InitialContext();
  // 自己扩展,可以内部扩展也可以外部扩展
  // class RemoteDate extends Date implements Remote {
  // }
  // ;
  ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
  ctx.close();
 }
 
 public static void findDate() throws NamingException, RemoteException {
  // 直接使用
  InitialContext ctx = new InitialContext();
  Date startTime = (Date) ctx.lookup("java:comp/env/systemStartTime");
  System.out.println("+++++++++++++++++++++++" + startTime.toString());
  ctx.close();
 }
 
 public static void jndiDate() throws NamingException, RemoteException {
  // Demo.initDate();
  Demo.initDate2();
  Demo.findDate();
 }
 
 public static void initPerson() throws NamingException, RemoteException {
  // 设置参数
  LocateRegistry.createRegistry(1099);
  System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
  System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
  InitialContext ctx = new InitialContext();
  // Person person = new Person();
  // person.setName("ellen");
  // person.setPass("000727");
  ctx.bind("java:comp/env/person", new Person());
  ctx.close();
 }
 
 public static void initPerson2() throws NamingException, RemoteException {
  // 设置参数
  LocateRegistry.createRegistry(1099);
  System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
  System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
  InitialContext ctx = new InitialContext();
  Person person = new Person();
  person.setName("ellen");
  person.setPass("000727");
  ctx.bind("java:comp/env/person", person);
  ctx.close();
 }
 
 public static void findPerson() throws NamingException, RemoteException {
  // 直接使用
  InitialContext ctx = new InitialContext();
  Person person = (Person) ctx.lookup("java:comp/env/person");
  System.out.println("------" + person.toString());
  System.out.println("------" + person.getName());
  System.out.println("------" + person.getPass());
  ctx.close();
 }
 
 public static void jndiPerson() throws NamingException, RemoteException {
  // Demo.initPerson();
  Demo.initPerson2();
  Demo.findPerson();
 }
 
 public static void main(String[] args) throws NamingException, RemoteException {
  // 为什么两个jndi的例子不能同时运行
  // internal error: ObjID already in use
  // Demo.jndiDate();
  Demo.jndiPerson();
 }
 
}

  

posted on   nevergiveupzeng  阅读(307)  评论(0编辑  收藏  举报

编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理
点击右上角即可分享
微信分享提示