Controles de Peticiones de Conexión
Los controles de peticiones de conexión se usan siempre que se necesita establecer o re-establecer una conexión con el
servidor LDAP. No afectan a otras operaciones LDAP no relacionadas con las conexiones, como "search" o "modify."
Inicializamos una control de petición de conexión de un contexto usando el constructor InitialLdapContext.
Aquí tenemos un ejemplo:
// Create the control to use when establishing connection
Control[] connCtls = new Control[]{new SampleRequestControl()};
// Create the initial context
LdapContext ctx = new InitialLdapContext(env, connCtls);
Este ejemplo crea un nuevo ejemplar de
InitialLdapContext con controles de conexión inicializados como
SampleRequestControl.
Una vez configurados, los controles de conexión (SampleRequestControl) son heredados
por todos los contextos derivados de este contexto. Observa que esto es distinto de los controles de peticiones de
contexto que no son heredados.
Cambiar los Controles de Petición de Conexión
Podemos cambiar los controles de petición de conexión de un contexto usando
LdapContext.reconnect(). Este método establece una nueva conexión con el
servidor LDAP usando los controles de petición suministrados como argumento. Si el argumento es
null, no se envía ningún control de petición. Después de que se haya establecido la
conexión, cualquier reconexión implícita, por ejemplo aquellas que resultan de atualización de credenciales, también
usarán los mismos controles.
reconnect() afecta sólo a la conexión que está siendo usada por el ejemplar
Context sobre el que se llamó a reconnect().
Cualquier nuevo ejemplar de Context que descienda del contexto hereda los nuevos
controles de conexión, pero los contextos que anteriormente compartían la conexión no se verán modificados. Es decir,
los controles de peticiones de control deben modificarse explícitamente y no se ven afectados por los cambios en otros
controles de peticiones de conéxión de otro contexto.
En el siguiente ejemplo, se crea un
InitialLdapContext con un SampleRequestControl.
Los controles de peticiones de contexto se configuran como null mediante una llamada a
reconnect(), con null como argumento.
// Create the control to use when establishing the connection
Control[] connCtls = new Control[]{new SampleRequestControl()};
// Create the initial context
LdapContext ctx = new InitialLdapContext(env, connCtls);
// Do something useful with ctx
// Reconnect by using no controls
ctx.reconnect(null);
Encontrar los Controles de Petición de Conexión que están Activos
Para encontrar los controles de petición de conexión que están activos para un contexto, usamos
LdapContext.getConnectControls(). Aquí tenemos un
ejemplo que inicializa los controles de peticiones de conexión
para ser SampleRequestControl y luego chequea los controles usando
getConnectControls():
// Create the control to use when establishing the connection
Control[] connCtls = new Control[]{new SampleRequestControl()};
// Create the initial context
LdapContext ctx = new InitialLdapContext(env, connCtls);
// Check the controls in effect for connection establishment
Control[] reqCtls = ctx.getConnectControls();
Aquí está la salida producida por este ejemplo:
SampleRequestControl@1fa4d891
com.sun.jndi.ldap.ManageReferralControl@1fa4d59d
Esta salida muestra el control que se añadió (SampleRequestControl) y el control
Manage Referral que el proveedor LDAP envía cuando se
ignoran las remisiones (es decir, se ha deseleccionado la propiedad de entorno
Context.REFERRAL o se ha configurado como "ignore").
Para evitar que el proveedor LDAP envíe este control, debemos configurar la propiedad
Context.REFERRAL como "throw" o como
"follow". Puedes ver más detales en la lección
Remisiones.
Inicializar un Control de Petición de Conexión de un Contexto de Remisión
Las remisiones se explicaron en detalle en la lección Referrals.
Cuando seguimos remisiones automáticametne, el contexto remitido hereda tanto la conexión como los controles de petición
de conexión del contexto original. Cuando manejamos las remisiones manualmente, tenemos la opción de ámbos controles
para cada contexto remitido.
Aquí tenemos un ejemplo. Los controles de petición de
conexión del contexto remitido se configuran pasando los controles a LdapReferralException.getReferralContext(Hashtable, Control[]).
Después de que se haya creado el contexto remitido, se envían los controles de petición de contexto mediante una llamada
a LdapContext.setRequestControls():
...
} catch (LdapReferralException e) {
Control[] connCtls = new Control[]{new SampleRequestControl()};
Control[] ctxCtls = new Control[]{
new SortControl(new String[]{"cn"}, Control.CRITICAL)
};
// Get the referral context by using connection controls
// when establishing the connection by using the referral
ctx = (LdapContext) e.getReferralContext(env, connCtls);
// Set the context request controls for the referral context
ctx.setRequestControls(ctxCtls);
}