2019独角兽企业重金招聘Python工程师标准>>>

检索过滤器

和基本检索不同的是,可以使用一个检索过滤器进行检索操作。检索过滤器的检索语句是通过逻辑表达式的形式表示的。检索过滤器的语法在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的时候,则表示没有时间限制。

转载于:https://my.oschina.net/liferay/blog/5802

使用JNDI操作LDAP(4)(转载)相关推荐

  1. 使用JNDI操作LDAP(5)(转载)

    2019独角兽企业重金招聘Python工程师标准>>> 1 新建条目 使用到了context里面的createSubcontext方法. /** * creates an ou wi ...

  2. java对接ldap_如何使用Java操作LDAP之LDAP连接(一)

    JAVA操作LDAP有几种方法,这里主要介绍的是JNDI包,就是它: com.sun.jndi.ldap.LdapCtxFactory LDAP默认情况下使用的是BDB数据库,所以呢,操作LDAP就和 ...

  3. RMI、JNDI、LDAP介绍+log4j漏洞分析

    介绍 本篇主要介绍java的RMI.JNDI.LDAP,在后面会详细分析log4j的jndi注入原理. 什么是RMI RMI全称是Remote Method Invocatioon,也就是远程方法调用 ...

  4. 用户姓名保护python_Python操作LDAP,对用户进行认证(验证用户名以及密码)

    Python操作LDAP,对用户进行认证 1.环境 Python版本: 3.7.1 操作系统:windows 7 x64 第三方包:python-ldap 2.LDAP LDAP,它是基于X.500标 ...

  5. java 操作 ldap_JAVA操作LDAP总结

    一.LDAP概念 LDAP的全称为Lightweight Directory Access Protocol(轻量级目录访问协议), 基于X.500标准, 支持 TCP/IP. LDAP目录为数据库, ...

  6. 解决ssh无操作自动断开[转载,已经验证]

    用SSH远程,如果几分钟没有任何操作,连接就会断开,必须重新登陆才行,非常麻烦,一般修改2个地方3项即可解决问题: 1.终端键入:echo $TMOUT        如果显示空白,表示没有设置,等于 ...

  7. JS操作保存cookie(转载他人)

    2019独角兽企业重金招聘Python工程师标准>>> 网上借鉴了一些朋友的经验,做了一个小例子,js操作cookie,实现登录密码保存.cookie的存放方式是以键值对的方式保存的 ...

  8. 经典SQL操作语句【转载】

    1.经典SQL语句大全(绝对的经典) 2. 3. 4.一.基础 1.1.说明:创建数据库 2.CREATE DATABASE database-name 3.2.说明:删除数据库 4.drop dat ...

  9. JAVA操作LDAP交互

    首先定义全局的ldap的IP地址等 看截图  ↓P1j#yZ@Gg*AE 开启ldap服务, 每次进行curd操作都需开服务 类似于jdbc那种 /** 关闭Ldap连接     */     pub ...

最新文章

  1. 关于android开发环境中sdk和adt更新到22.6之后多了appcompat_v7
  2. feachall php_集合:给 PHP 数组插上翅膀
  3. python常用命令格式_python常用命令有哪些
  4. (pytorch-深度学习系列)CNN二维卷积层-学习笔记
  5. wpf 代码获取contextmenu_[C#] 转:在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件...
  6. Day7 子类调用父类的方法supper 绑定方法与非绑定方法
  7. 55 FI配置-财务会计-固定资产-主数据-定义4-字符评估组
  8. Python机器学习:PCA与梯度上升:05高维数据映射成低维数据(封装一个PCA)
  9. 多进程通信相关函数归纳
  10. mysql+时间串联_mysql时间操作
  11. 第十二章 演员评论家(Actor-Critic)-强化学习理论学习与代码实现(强化学习导论第二版)
  12. php 获取alexa排名
  13. C++封装Mysql数据库
  14. 【量化金融】利用DCF估值模型实现股票价值监测
  15. MySQL简单技巧(三):教你轻松用information_schema表+python实现表结构同步(上)——理论篇
  16. 【JZOJ 5424】【NOIP2017提高A组集训10.25】凤凰院凶真
  17. SAMBA配置 “你可能没有权限访问网络资源”的问题解决方法
  18. 优化设计——多目标函数优化(降维/主目标法、线性加权法、理想点法)——MATLAB编程
  19. HTTP Referer 教程
  20. 基于神经网络的预测控制,神经网络预测系统应用

热门文章

  1. AC日记——字符串位移包含问题 1.7 19
  2. 通过string型类名实例化一个类
  3. Java:集合for高级循环遍历
  4. CABasicAnimation x y z 轴旋转动画
  5. C语言入门(4)——常量、变量与赋值
  6. asp.net发送邮件
  7. Android—打包aar以及module依赖操作
  8. uni-app 发送form-data参数的请求方式传值给后台
  9. IOS基础之毛毛虫案例-重力
  10. 2021京山一中高考成绩查询,京山一中的2020高考喜报三天前就发布了,钟祥一中为什么还没有公布?...