1

我正在通过将主题类存储在 ThreadLocal 映射中来试验授权和身份验证的解决方案。该设计是针对 API 的,因此我无法访问所涉及的 servlet,并且我需要使用 EJB3(因此CDI不是一个选项)。我有几个关于在 EJB3 中使用 ThreadLocal 的问题

  1. 假设每个请求在完成后都会清理其 ThreadLocal 映射,那么将 ThreadLocal 变量与无状态会话 bean 一起使用是否有任何风险?换句话说,是否存在两个请求同时访问同一个线程的风险?

  2. 有没有办法强制 servlet 在完成后清理 ThreadLocal?我研究过拦截器,但我了解到它们在 EJB3 中的工作很差,并且在不同的应用程序服务器中工作得也不尽相同。还有什么办法吗?

4

3 回答 3

2

关于 Martin 的回答,值得注意的是 Spring Security 本身默认使用 ThreadLocal (SecurityContextHolder),所以如果您需要安全上下文在 EJB 调用中生存,我会谨慎使用它。当然,它不适用于远程调用。它可能与本地,但我不认为有任何保证。

通常,在使用 Spring Security 时,我会避免使用 EJB,而是使用 Spring Framework 来连接 POJO 中间层并通过 AOP 提供诸如事务分界之类的服务。然后,安全上下文在整个中间层都可用,因为线程在整个调用中保持不变。

于 2010-12-09T11:14:56.173 回答
0

我建议不要在 EJB 容器中使用 ThreadLocal。授权和身份验证是一个跨领域的问题,我个人会考虑使用 AOP 之类的东西(例如 Spring 安全性如何处理它)。

于 2010-12-02T13:04:20.590 回答
0

要回答我自己的问题,不,似乎没有任何安全性。如果我可以控制整个过程,则使用线程局部变量可能会起作用,但如果我这样做了,那么我可以使用 CDI och JSP 来保留请求局部变量。

指向所有回答的人。

于 2011-02-09T15:00:33.757 回答