轻载目录协议(lightwight Directory Access Protocol)
其类似于做了查询优化的数据库。国外的信息服务站点大都用到了ldap
其类似于做了查询优化的数据库。国外的信息服务站点大都用到了ldap
解决方案 »
- 老是给了一道关于Java的题,请牛人帮助!
- 【大二学生】 我想用栈存储字符,可是没有一种栈可以用?
- 关于生成XML的问题
- 网络对话的问题 异常关闭时服务器端出错
- 请教大家
- 请问requestDispatcher的forward方法如何传递参数。搜索了一下使用request.setAttribute()进行设置,好象不行, 详细代码内附。
- 局域网内将客户端的文件拷贝到服务器端
- 关于JTABLE 的问题,大家能帮忙看一下吗,我挺急 谢谢大家
- E J B 2.0 中关于CMP 两个Bean 之间关系很困惑的问题?
- 求帮忙解释一下
- java.lang.NoClassDefFoundError: javax/mail/Authenticator
- 一个入门问题
IBM公司也有
import java.util.*;
import javax.naming.*;
import javax.naming.directory.*;
import java.io.*;
import java.beans.*;
public class ConnLDAP{
public ConnLDAP(){
super();
}
private String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
private String HOST = "rhserver";
private String VERSION = "3";
private String SEARCHBASE = "o=example.com";
private String PORT = "389";
private static String MGR_DN = "cn=Manager,dc=example,dc=com";
private static String MGR_PW = "secret";
private static String MY_ENTRY;
private static final int SUB = SearchControls.SUBTREE_SCOPE;
private DirContext ctx;
String dn;
String filter;
String[] attribs;
Hashtable atts;
public String getHOST(){
return HOST;
}
public String getSEARCHBASE(){
return SEARCHBASE;
} public String getVERSION(){
return VERSION;
}
public String getPORT(){
return PORT;
} public boolean connect(String VERSION,
String HOST,
String PORT){
this.HOST = HOST;
this.SEARCHBASE = SEARCHBASE;
this.VERSION = VERSION;
this.PORT = PORT; Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL,"ldap://rhserver:389");
//管理员控制
env.put(Context.SECURITY_AUTHENTICATION,"simple");
env.put(Context.SECURITY_PRINCIPAL,MGR_DN);
env.put(Context.SECURITY_CREDENTIALS,MGR_PW);
try{
ctx = new InitialDirContext(env);
System.out.println("ok!");
}catch(NamingException e){
System.out.println(e);
env.clear();
return false;
}
return true;
}
public boolean search(String dn,
String filter,
String[] attribs) throws NamingException{
/*
Hashtable env = new Hashtable();
try {
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL,"ldap://rhserver:389");
DirContext ctx = new InitialDirContext(env);
Attributes match = new BasicAttributes();
//for (int i = 1; i <args.length; i+= 2) {
//match.put(args[i], args[i+1]);
//}
ctx.search("dc=example,dc=com", match);
//printSearchList(args[0], ctx.search(args[0], match));
} catch (Exception e) {
e.printStackTrace();
}
*/ //定义查询条件
this.dn = dn;
this.filter = filter;
this.attribs = attribs; try {
//连接LDAP服务器
connect(VERSION,HOST,PORT);
//重定义属性数组,供获取属性值时用
String [] attrs = new String [ attribs.length+1 ];
attrs[0] = "objectclass";
System.arraycopy(attribs, 0, attrs, 1, attribs.length);
//查询条目集合
NamingEnumeration results = ctx.search(dn,filter,new SearchControls());
//*************对每个条目获取其属性值***********
while(results != null && results.hasMoreElements()){
Vector vl = new Vector(attribs.length+1);
//取每一个条目并获取条目名称
SearchResult si = (SearchResult)results.next();
String name = si.getName().trim();
//System.out.println(name);
if (name.length() == 0)
vl.addElement(dn);
else
vl.addElement(name+","+dn);
//取出每个条目的每一个属性值
for (int i=0;i<=attribs.length;i++){
Attribute a = si.getAttributes().get(attrs[i]);
if (a == null) {
vl.addElement("N/A");
}
else {
//数据类型的转化
Object v = a.get();
if (v instanceof byte[]) {
vl.addElement( Common.format( (byte[])v ) );
}
else
System.out.println(attrs[i] + ": " + a.get().toString());
vl.addElement(a.get().toString() );
}
}
}
return true;
//******************************************************
}
catch(NamingException e){
System.out.println(e);
return false;
}
}
//在增加条目中调用
public BasicAttributes convertHashtable(Hashtable tmp) {
Attributes atts = new BasicAttributes();
Enumeration e = tmp.keys();
while(e.hasMoreElements()) {
String keya = (String)e.nextElement();
//System.out.println(tmp.get(keya));
Object[] values =(Object[])tmp.get(keya);
BasicAttribute at = convertValues(keya, values);
atts.put (at);
}
return (BasicAttributes)atts;
}
private BasicAttribute convertValues(String name, Object [] values) {
BasicAttribute att = new BasicAttribute(name);
for (int i=0;i<values.length;i++) {
att.add( values[i] );
}
return att;
}
//增加条目
public boolean addObject(String dn, Hashtable atts) throws NamingException{ this.atts = atts;
this.dn = dn;
Attributes ats = convertHashtable(atts);
/*从Attributes中取出属性名称和属性值,可以看出Attributes的格式是正确的!
for(NamingEnumeration ee = ats.getAll();ee!=null&&ee.hasMoreElements();){
Attribute eeats = (Attribute)ee.next();
System.out.println("attribute:"+eeats.getID());
for(NamingEnumeration ss=eeats.getAll();ss.hasMoreElements();System.out.println("values:"+ss.nextElement()));
}*/
//System.out.println(HOST);
//连接服务器
connect(VERSION,HOST,PORT);
ctx.createSubcontext(dn,ats);
return true;
}
//增加属性
public boolean addAttrib (String dn, String attr, Object [] values) {
try {
modifyObject(dn, DirContext.ADD_ATTRIBUTE, attr, values);
} catch( NamingException e ) {
return false;
} return true;
}
//修改条目
public boolean updateObject (String dn, Hashtable atts) {
try {
Attributes at = convertHashtable(atts);
connect(VERSION,HOST,PORT);
ctx.modifyAttributes(dn, DirContext.REPLACE_ATTRIBUTE, at);
} catch (NamingException e) {
return false;
} return true;
}
//修改属性
public boolean updateAttrib (String dn, String attr, Object [] values) {
try {
modifyObject(dn, DirContext.REPLACE_ATTRIBUTE, attr, values);
} catch( NamingException e ) {
return false;
}
return true;
}
//删除条目
public boolean delete(String MY_ENTRY){
try{
this.MY_ENTRY = MY_ENTRY;
connect(VERSION,HOST,PORT);
ctx.destroySubcontext(MY_ENTRY);
}catch(NamingException e){
return false;
}
return true;
}
//删除属性
public boolean deleteAttrib (String dn, String attr, Object [] values) {
try {
modifyObject(dn, DirContext.REMOVE_ATTRIBUTE, attr, values);
} catch( NamingException e ) {
return false;
} return true;
}
//断开连接
public boolean disconnect() {
try {
if (ctx != null) ctx.close();
} catch (NamingException e) {
return false;
}
ctx = null;
return true;
}
////////////////////////////////////////////////////////////////
private void modifyObject(String dn, int mod_type, String attr,
Object [] values)
throws NamingException {
ModificationItem[] mods = new ModificationItem[1];
BasicAttribute mod1;
if (values == null)
mod1 = new BasicAttribute(attr);
else
mod1 = convertValues(attr, values);
mods[0] = new ModificationItem(mod_type, mod1);
ctx.modifyAttributes(dn, mods);
}
/*public void Error(String msg,Exception e){
String detail;
if (e == null)
detail = null;
else
detail = e.getMessage();
listeners.firePropertyChange("error",msg,detail);
if (debugMode && e !=null){
System.err.println(e);
}
}*/
}