在Ldap搜索上设置方法超时

时间:2016-02-25 20:18:56

标签: java timeout blocking nonblocking

private Authentication authenticateUserPassword(UsernamePasswordAuthenticationToken token) throws NamingException {
    Object login = login(token);
    LOGGER.debug("Starting authentication login='{}'", login);
    Object password = token.getCredentials();

    LdapContext ctx = createLdapCtx(login, password);
    SearchControls ctrls = createSearchControls();
    String filter = String.format(this.filter, login);

    NamingEnumeration<SearchResult> ne = ctx.search(dn, filter, ctrls);
    ....

我有以下方法登录用户。这取决于LDAP。有时它挂在最后一排。我不知道为什么。它有时会在性能测试中重现。

有没有办法等待一段时间,如果方法没有响应 - 返回一些预定义的值?

P.S。

private LdapContext createLdapCtx(Object login, Object password) throws NamingException {
    Hashtable<String, String> props = new Hashtable<String, String>();
    props.put(Context.INITIAL_CONTEXT_FACTORY, factory);
    props.put(Context.PROVIDER_URL, url);
    props.put(Context.SECURITY_AUTHENTICATION, "simple");
    props.put(Context.SECURITY_PRINCIPAL, String.format(domain, login));
    props.put(Context.SECURITY_CREDENTIALS, password.toString());

    return new InitialLdapContext(props, null);
}

2 个答案:

答案 0 :(得分:3)

您可以设置time-out for all Ldap operations

  

新的环境属性:com.sun.jndi.ldap.read.timeout可用于指定LDAP操作的读取超时。此属性的值是一个整数的字符串表示形式,表示LDAP操作的读取超时(以毫秒为单位)。

因此,您只需更新createLdapCtx方法,将环境变量指定为您选择的值:

props.put("com.sun.jndi.ldap.read.timeout", "1000"); // 1 second of timeout here

如果服务器在1秒内没有响应,这将导致LDAP服务提供程序中止读取尝试。如果达到超时,则会设置NamingException

请注意,从this Stack Overflow post开始,您无法使用方法SearchControls.setTimeLimit,因为此参数不适用于读取超时。

答案 1 :(得分:0)

您的SearchControl很可能有一种设置超时的方法。你能检查一下吗?你应该可以做ctrls.setTimeLimit(ms);