хранить информацию.
я есть немного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()
?