在 Ldap 搜索上设置方法超时
Set method timeout on Ldap search
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。有时它挂在最后一行。我不知道为什么。它有时会在性能测试中重现。
有没有办法等待一段时间,如果方法没有响应 - return 一些预定义的值?
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);
}
你可以设置一个time-out for all Ldap operations:
The new environment property: com.sun.jndi.ldap.read.timeout
can be used to specify the read timeout for an LDAP operation. The value of this property is the string representation of an integer representing the read timeout in milliseconds for LDAP operations.
因此,您只需要更新 createLdapCtx
方法以将该环境变量指定为您选择的值:
props.put("com.sun.jndi.ldap.read.timeout", "1000"); // 1 second of timeout here
如果服务器在 1 秒内没有响应,这将导致 LDAP 服务提供商中止读取尝试。如果达到超时,将出现 NamingException
。
请注意,从 this Stack Overflow post 开始,您不能为此使用方法 SearchControls.setTimeLimit
,因为此参数不适用于读取超时。
您的 SearchControl 很可能有设置超时的方法。你能检查一下吗?你应该可以做到 ctrls.setTimeLimit(ms);
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。有时它挂在最后一行。我不知道为什么。它有时会在性能测试中重现。
有没有办法等待一段时间,如果方法没有响应 - return 一些预定义的值?
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);
}
你可以设置一个time-out for all Ldap operations:
The new environment property:
com.sun.jndi.ldap.read.timeout
can be used to specify the read timeout for an LDAP operation. The value of this property is the string representation of an integer representing the read timeout in milliseconds for LDAP operations.
因此,您只需要更新 createLdapCtx
方法以将该环境变量指定为您选择的值:
props.put("com.sun.jndi.ldap.read.timeout", "1000"); // 1 second of timeout here
如果服务器在 1 秒内没有响应,这将导致 LDAP 服务提供商中止读取尝试。如果达到超时,将出现 NamingException
。
请注意,从 this Stack Overflow post 开始,您不能为此使用方法 SearchControls.setTimeLimit
,因为此参数不适用于读取超时。
您的 SearchControl 很可能有设置超时的方法。你能检查一下吗?你应该可以做到 ctrls.setTimeLimit(ms);