Я исследую и экспериментирую с переменной ThreadLocal в своем веб-приложении Java. Я использую переменную ThreadLocal для хранения имени пользователя (полученного из сеанса) перед запросом, а затем удаляю его после запроса. Я сделал это, вызвав статический служебный метод в ServletFilter. Причина, по которой я просто не получаю имя пользователя из сеанса, заключается в том, что я унаследовал систему с длительными процессами, выполнение которых иногда занимает больше времени, чем позволяет тайм-аут сеанса. Моя идея состоит в том, чтобы получить имя пользователя до того, как запрос будет обработан, и сохранить его в переменной ThreadLocal, тем самым предоставив мне доступ к имени пользователя на протяжении всего запроса, даже если это занимает более 15 минут.
Мой вопрос:
Есть ли какие-либо проблемы с безопасностью / производительностью в этой конструкции, и если да, то что было бы лучшим решением? Даже если нет проблем с безопасностью и / или производительностью, лучшие идеи приветствуются. Отрывки из моего решения показаны ниже:
Вот мой служебный класс, который будет вызываться в моем фильтре и везде, где мне понадобится имя пользователя.
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();
}
}
Вот мой фильтр сервлета, используемый для установки имени пользователя перед запросом (и очистите его с помощью блока finally после запроса).
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();
}
}
}
Вот моя конфигурация 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>
Любые идеи приветствуются :)