Подтвердить что ты не робот

Статическая переменная ThreadLocal в WebApp. Есть ли проблемы безопасности/производительности?

Я изучаю и экспериментирую с переменной 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>

Любые идеи очень ценятся:)

4b9b3361

Ответ 1

Это на самом деле довольно распространенный подход для прикрепления информации безопасности к потоку выполнения (или к любой другой информации, связанной с выполнением).

Он используется в серверах Java EE внутри и сторонним кодом /utils, например Spring.

Он будет работать нормально.