ThreadLocal - usando como informações de contexto para a API REST com boot por mola
eu tenho algunsspring-boot
aplicação (expõe o resto da API). A API REST mencionada é protegida porspring-security
. Está tudo bem, mas agora eu preciso definir o contexto para a solicitação de manutenção. Definir contexto é escolher a fonte de dados depende do contexto do usuário. A chave é que RoutingDataSource precisa usar esse contexto. (Esse contexto deve ser definido diretamente após a autenticação da solicitação devido a outras causas, também tenho outro encadeamento que usa RoutingDataSource, mas não é invocado pela solicitação (sem contexto do usuário)).
Essas coisas eu posso fazer, no entanto, minhas dúvidas estão preocupadas com a segurança do contexto do tópico e a limpeza dele. Tentei encontrar resposta nos documentos, mas não consegui.
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();
}
}
E definindo o contexto:
@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);
}
}
Eu posso fazer isso. No entanto, porquespring-boot
é multi-thread e eu estou usandoThreadLocal
para manter o contexto, tenho medo da segurança de threads dessa configuração.
Quando defino este contexto? No filtro,somente após sucesso autorização do pedido. Então, as perguntas são:
É thread-safe? Significa: Posso assumir queo mesmo thread que executa o filtro (daí também esse contexto do conjunto de threads em suapróprio local contexto) também executa a solicitação inteira (por exemplo, chamar métodos do dao, enviar resposta, executar o corpo do controlador)?
Se no caso 1. Posso assumir que um encadeamento funciona com a solicitação do início ao fim (begin inclui filtro após solicitação segura), quando devo chamarclearContext()
?