хранить информацию.

я есть немногоspring-boot приложение (оно выставляет остальные API). Упомянутый REST API защищенspring-security, Все хорошо, однако теперь мне нужно установить контекст для обслуживания запроса. Настройка контекста заключается в выборе источника данных в зависимости от контекста пользователя. Ключ в том, что RoutingDataSource нужно использовать этот контекст. (Этот контекст должен быть установлен непосредственно после аутентификации запроса по другим причинам, у меня есть также другой поток, который использует RoutingDataSource, но не вызывается по запросу (без пользовательского контекста)).

Эти вещи я могу сделать, однако мои сомнения связаны с поточной безопасностью контекста и его очисткой. Я пытался найти ответ в документах, но мне не удалось.

public class CustomContextHolder {

   private static final ThreadLocal<DatabaseType> contextHolder = 
            new ThreadLocal<DatabaseType>();

   public static void setContext(DatabaseType databaseType) {
      contextHolder.set(databaseType);
   }

   public static CustomerType getContext() {
      return (CustomerType) contextHolder.get();
   }

   public static void clearContext() {
      contextHolder.remove();
   }
}

И настройка контекста:

@Component
class AuthorizedRequestFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, 
                                    HttpServletResponse response, 
                                    FilterChain filterChain) throws ServletException, IOException {

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication.isAuthenticated()) {
            // here we set context
        }

        filterChain.doFilter(request, response);
    }
}

Я могу сделать это. Тем не менее, потому чтоspring-boot является многопоточным, и я используюThreadLocal для удержания контекста я боюсь потоковой безопасности этой конфигурации.

Когда я установлю этот контекст? В фильтре,только после успешного авторизация запроса. Итак, вопросы:

Это потокобезопасно? Это означает: могу ли я предположить, чтотот же самый поток, который выполняет фильтр (следовательно, также этот контекст набора потоков в егособственный местный контекст) также выполняет весь запрос (например, вызов методов из dao, отправка ответа, выполнение тела контроллера)?

Если в случае 1. Я могу предположить, что один поток работает с запросом от начала до конца (начало включает фильтр после защищенного запроса), то когда мне следует вызватьclearContext() ?

Ответы на вопрос(4)

Ваш ответ на вопрос