壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13504|回复: 1

使用JNDI操作LDAP(4)(转载)

[复制链接]
发表于 2010/6/29 11:08:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
检索过滤器
和基本检索不同的是,可以使用一个检索过滤器进行检索操作。检索过滤器的检索语句是通过逻辑表达式的形式表示的。检索过滤器的语法在RFC 2254中进行了定义,DirContext.search()方法接受符合这个语法的过滤器。
下面的检索过滤器指定了合法的实体必须具有sn属性,并且其值为Geisel以及一个值为任意的mail属性:(&(sn=Geisel)(mail=*))
下面的代码创建了一个过滤器和一个默认的检索控制,SearchControls,并使用它们来进行检索操作。这个检索和基本检索中的功能是一样的。
// Create default search controls
SearchControls ctls = new SearchControls();
// Specify the search filter to match
// Ask for objects with attribute sn == Geisel and which have
// the "mail" attribute.
String filter = "(&(sn=Geisel)(mail=*))";
// Search for objects using filter
NamingEnumeration answer = ctx.search("ou=People", filter, ctls);
// Print the answer
while (answer.hasMore()) {
         SearchResult sr = (SearchResult) answer.next();
         System.out.println(">>>" + sr.getName());
         GetattrsAll.printAttrs(sr.getAttributes());
}
检索返回的结果和基本检索的结果是一样的。
检索过滤器语法一览
检索过滤器语法基本上就是逻辑运算符作为前缀的逻辑表达式,下图是一些逻辑运算符号及其说明:



过滤器中的每一项都由属性标识符和属性值或者上述的运算符号组成。例如,”sn=Geisel”表示必须具有sn属性,并且sn属性的值必须为Geisel,”mail=*”则表示mail属性只要存在就可以了。
每一项都必须使用括号括起来使用。逻辑运算符可以组合使用,通过使用括号进行分割。例如
(| (& (sn=Geisel) (mail=*)) (sn=L*))
关于更完整的语法描述,参见RFC 2254。
返回指定属性
可以通过设置SearchControls的setReturningAttributes()方法来设置需要返回的特定属性:
// Specify the ids of the attributes to return
String[] attrIDs = { "sn", "telephonenumber", "golfhandicap","mail" };
ctls.setReturningAttributes(attrIDs);
其返回的结果和基本认证返回的一致。

检索控制
在上面的检索过滤器中如何使用SearchControls参数来选择需要返回的属性。还可以是SearchControls参数来控制检索的其他方面,下面是一些可用的控制:
¨         返回的属性
¨         检索的范围
¨         返回的最大结果数
¨         等待最大时间(毫秒),即超时时间
¨         是否返回和实体相关联的Java对象
¨         在检索时是否废除JNDI链接
其中后两部分在之后的教程中介绍,本部分教程介绍前四种控制:
检索范围
通过使用SearchControls.setSearchScope(int scope)方法来设置检索范围,检索范围由三种,分别如下:
static int
OBJECT_SCOPE
检索指定的对象
static int
ONELEVEL_SCOPE
检索指定对象及其直接子实体
static int
SUBTREE_SCOPE
在以指定对象为根的子树中进行检索
下图摘自ApacheDS网站对于检索范围的说明,比较易懂:



数量限制
有的时候,需要限制查询返回结果的数量,这个时候需要使用检索控制的数量限制。默认情况下,检索操作返回所有符合条件的检索结果,可以使用SearchControls.setCountLimit()方法设置检索结果的数量。下面的代码将检索结果数量设置为1:
// Set search controls to limit count to 'expected'
SearchControls ctls = new SearchControls();
ctls.setCountLimit(expected);
如果程序要获取大于最大数量的结果,那么将抛出一个SizeLimitExceededException。所以当设置数量限制的时候,应该将这个异常和NamingExceptions异常相区分,或者根据数量限制请求结果(不要超过最大数量)。
指定检索结果的数量是一种控制程序消耗资源的方法,比如内存或者网络带宽。其他控制资源消耗的办法有实用查询过滤器、在适当的上下文中查询以及使用适当的检索范围。
设置超时

设置超时是为了不至于等待太长的时间,如果超过时间限制,操作还没有执行完的话,将抛出TimeLimitExceededException,下面的代码设置了时间限制:
ctls.setTimeLimit(1000); //set time limit to 1 second
为了使这个程序运行,需要做一些特殊的设置,例如使用较慢的服务器或者检索范围使用SUB_TREE检索,并且服务器最好包含大量的实体。
当设置时间限制为0的时候,则表示没有时间限制。
file:///C:/Documents%20and%20Settings/Administrator/%E6%A1%8C%E9%9D%A2/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/1/%E4%BD%BF%E7%94%A8JNDI%E6%93%8D%E4%BD%9CLDAP%EF%BC%884%EF%BC%89_files/3123_2748026_1.jpg

发表于 2010/8/17 15:57:47 | 显示全部楼层
Liferay门户是世界领先的开源企业门户解决方案,采用最新的Java,J2EE和Web 2.0技术。

运行在任何Java EE应用服务器,servlet容器,数据库和操作系统
现成的组件可用性---60多个portlet可供选择
内建有内容管理系统和协作套件
现成的开发工具盒
基于AJAX用户界面的获奖支持
本地化为22种语言,现成的组件
完全LDAP同步
使用logicLibray的logiscan门户平台套件的最安全门户平台
商用友好的MIT授权协

中国大连Liferay服务

QQ:1417153858 (Liferay支持)
QQ:1410151582 (Liferay培训)
QQ:1492270185 (Liferay企业版)

联系电话:
0411-8489 8263 (总机)
86-15601156692 (咨询)

Liferay中国服务大连QQ群: 49845872

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 18:42 , Processed in 0.016724 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表