2011-06-02 11 views
12

Estoy investigando y experimentando con una variable ThreadLocal en mi aplicación web Java. Estoy usando la variable ThreadLocal para almacenar un nombre de usuario (recopilado de la sesión) antes de una solicitud y luego eliminarlo después de la solicitud. Lo he hecho llamando a un método de utilidad estático en un ServletFilter. La razón por la que no recupero el nombre de usuario de la sesión es porque heredé un sistema con procesos de larga ejecución que a veces tardan más en ejecutarse de lo que permitiría el tiempo de espera de la sesión. Mi idea es obtener el nombre de usuario antes de procesar la solicitud y almacenarla en una variable ThreadLocal, lo que me da acceso al nombre de usuario durante toda la solicitud, incluso si lleva más de 15 minutos.Variable estática de ThreadLocal en una aplicación web: ¿Hay problemas de seguridad/rendimiento?

Mi pregunta es:

¿Hay alguna preocupación de seguridad/rendimiento con este diseño, y si es así, ¿cuál sería una solución mejor? Incluso si no hay problemas de seguridad o rendimiento, se aceptan mejores ideas. Fragmentos de mi solución se muestran a continuación:

Aquí está mi clase de utilidad que se llamaría en mi filtro y en cualquier lugar que necesitaría el nombre de usuario.

public abstract class UserUtil { 
private static final ThreadLocal<String> threadUser = new ThreadLocal<String>(); 

public static String getUserId(){ 
    return threadUser.get(); 
} 

public static void setUserId(String userId){ 
    threadUser.set(userId); 
} 

public static void removeUserId(){ 
    threadUser.remove(); 
} 
} 

Aquí está mi filtro de servlet utilizado para establecer el nombre de usuario antes de la solicitud (y borrarlo a través del bloque finally después de la solicitud).

public class UserFilter implements Filter { 
public void init(FilterConfig filterConfig) throws ServletException { 
} 

public void destroy() { 
} 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    try { 
     HttpServletRequest request = (HttpServletRequest) servletRequest; 
     UserBean userBean = (UserBean) ((HttpServletRequest) servletRequest).getSession().getAttribute("userBean"); 
     UserUtil.setUserId(userBean.getUserId()); 

     filterChain.doFilter(servletRequest, servletResponse); 
    } finally{ 
     UserUtil.removeUserId(); 
    } 
} 

} 

Aquí está mi configuración web.xml:

<!--web.xml--> 
<web-app> 

... 
... 
... 

<filter> 
    <filter-name>UserFilter</filter-name> 
    <filter-class>filter.UserFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>UserFilter</filter-name> 
    <url-pattern>*.jsf</url-pattern> 
</filter-mapping> 

Todas las ideas son muy apreciados :)

+0

Recomendaría iniciar un hilo asíncrono para realizar la ejecución larga y realizar la comunicación del usuario en el hilo del servlet. –

Respuesta

7

Esto es en realidad un enfoque bastante común para la fijación de información de seguridad para el hilo de ejecución (o cualquier otra información relacionada con la ejecución).

Se usa internamente en servidores Java EE y también utiliza código/utilidades de terceros como Spring.

Funcionará bien.

+0

Información verificada. ¡Gracias! – javagruffian

Cuestiones relacionadas