Desarrollo de filtros de servlets para el proceso de inicio de sesión de formulario
Utilizando el mecanismo de inicio de sesión basado en formulario, puede controlar el diseño de la pantalla de inicio de sesión. En el inicio de sesión basado en formulario, debe especificar una página de inicio de sesión que se utiliza para recuperar la información sobre el ID de usuario y la contraseña. También se puede especificar una página de error que se visualice cuando la autenticación no sea correcta.
Acerca de esta tarea
Si se requiere una autenticación adicional o un proceso adicional antes y después de la autenticación, se pueden utilizar los filtros de servlets. Los filtros de servlets pueden utilizarse para interceptar de forma dinámica las solicitudes y las respuestas para transformar o utilizar la información contenida en las solicitudes o las respuestas. Uno o más filtros de servlets pueden adjuntarse a un servlet o a un grupo de servlets. Los filtros de servlets también se pueden adjuntar a archivos JSP y páginas HTML. Antes de invocar al servlet se llama a todos los filtros de servlets que se han adjuntado.
Tanto el filtro de servlet como el filtro de inicio de sesión basado en formulario reciben soporte en todos los contenedores Web que cumplan con la especificación de servlet versión 2.3. El servlet de inicio de sesión basado en formulario lleva a cabo la autenticación y los filtros de servlets pueden efectuar tareas adicionales de autenticación, auditoría o de registro cronológico de la información.
Para llevar a cabo acciones previas y posteriores al inicio de sesión con los filtros de servlet, configure estos filtros para que den soporte a la página de inicio de sesión basado en formulario o para el URL /j_security_check. El URL j_security_check se envía mediante una página de inicio de sesión basado en formulario con el parámetro j_username que contiene el nombre de usuario y el parámetro j_password que incluye la contraseña. Un filtro de servlet puede utilizar el parámetro de nombre de usuario y la información de contraseña para realizar otras tareas de autenticación o para otras necesidades especiales.
Procedimiento
Ejemplo
Este filtro de inicio de sesión puede correlacionarse con el URL /j_security_check para realizar acciones previas y posteriores al inicio de sesión.
import javax.servlet.*;
public class LoginFilter implements Filter {
protected FilterConfig filterConfig;
// Called once when this filter is instantiated.
// If mapped to j_security_check, called
// very first time j_security_check is invoked.
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
// Called for every request that is mapped to this filter.
// If mapped to j_security_check,
// called for every j_security_check action
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws java.io.IOException, ServletException {
// perform pre-login action here
chain.doFilter(request, response);
// calls the next filter in chain.
// j_security_check if this filter is
// mapped to j_security_check.
// perform post-login action here.
}
}Utilización de filtros de servlet para realizar procesos anteriores y posteriores al inicio de sesión durante el inicio de sesión de formulariosEste ejemplo ilustra un modo en que los filtros de servlet pueden realizar los procesos anteriores y posteriores al inicio de sesión durante el inicio de sesión de formularios.
Servlet filter source code: LoginFilter.java
/**
* A servlet filter example: This example filters j_security_check and
* performs pre-login action to determine if the user trying to log in
* is in the revoked list. If the user is on the revoked list, an error is
* sent back to the browser.
*
* This filter reads the revoked list file name from the FilterConfig
* passed in the init() method. It reads the revoked user list file and
* creates a revokedUsers list.
*
* When the doFilter method is called, the user logging in is checked
* to make sure that the user is not on the revoked Users list.
*
*/
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class LoginFilter implements Filter {
protected FilterConfig filterConfig;
java.util.List revokeList;
/**
* init() : init() method called when the filter is instantiated.
* This filter is instantiated the first time j_security_check is
* invoked for the application (When a protected servlet in the
* application is accessed).
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
// read revoked user list
revokeList = new java.util.ArrayList();
readConfig();
}
/**
* destroy() : destroy() method called when the filter is taken
* out of service.
*/
public void destroy() {
this.filterConfig = null;
revokeList = null;
}
/**
* doFilter() : doFilter() method called before the servlet to
* which this filter is mapped is invoked. Since this filter is
* mapped to j_security_check,this method is called before
* j_security_check action is posted.
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws java.io.IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
// pre login action
// get username
String username = req.getParameter("j_username");
// if user is in revoked list send error
if ( revokeList.contains(username) ) {
res.sendError(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);
return;
}
// call next filter in the chain : let j_security_check authenticate
// user
chain.doFilter(request, response);
// post login action
}
/**
* readConfig() : Reads revoked user list file and creates a revoked
* user list.
*/
private void readConfig() {
if ( filterConfig != null ) {
// get the revoked user list file and open it.
BufferedReader in;
try {
String filename = filterConfig.getInitParameter("RevokedUsers");
in = new BufferedReader( new FileReader(filename));
} catch ( FileNotFoundException fnfe) {
return;
}
// read all the revoked users and add to revokeList.
String userName;
try {
while ( (userName = in.readLine()) != null )
revokeList.add(userName);
} catch (IOException ioe) {
}
}
}
}
<filter id="Filter_1">
<filter-name>LoginFilter</filter-name>
<filter-class>LoginFilter</filter-class>
<description>Performs pre-login and post-login operation</description>
<init-param>
<param-name>RevokedUsers</param-name>
<param-value>c:\WebSphere\AppServer\installedApps\
<app-name>\revokedUsers.lst</param-value>
</init-param>
</filter-id>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/j_security_check</url-pattern>
</filter-mapping>user1
cn=user1,o=ibm,c=us
user99
cn=user99,o=ibm,c=us