我确信我在这里遗漏了一些东西..但我有一个 session 范围的 EJB:
@javax.inject.Named
@javax.ejb.Stateful
@javax.enterprise.context.SessionScoped
public class Authenticator implements Serializable
{
...
我希望每个 HTTP session 都会看到此 EJB 的不同实例?
但是,当从多个浏览器(包括在不同的机器上)访问 JSF 页面时,
的输出#{authenticator.hashCode()}
在所有这些上都是相同的(当然还有类的成员属性)。为什么会这样呢? (我尝试过删除 @Stateful 注释,但同样适用)。
我使用的是 JBoss AS 7.1.0。
编辑:我发现在身份验证器上创建一个方法:
public void getHashCode()
{
return hashCode();
}
并在 EL 中将其引用为
#{authenticator.hashCode()}
显示我实际上正在访问 bean 的不同实例;但这是为什么呢?我不明白为什么这两个EL表达式的结果会不同。
最佳答案
您看到的行为与未经身份验证的 HTTP session 一致,因此我假设您没有设置身份验证。因此,如果您将以下内容添加到代码中
@Resource
private EJBContext ctx;
public Principal getPrincipal() {
return this.ctx.getCallerPrincipal();
}
并在您的测试页面中添加
<h:outputText value="#{test.principal}" />
<h:outputText value="#{test.hashCode()}" />
您将始终看到相同的输出。对于 EJB 容器,由于在本地调用中客户端实际上是 servlet 容器,因此您将始终看到相同的输出 ANONYMOUS{此处为您的哈希代码}
。每个未经身份验证的 http session 都算作一个 ANONIMOUS
EJB session ,因为客户端始终相同 - 您的 servlet 容器。
尝试设置某种身份验证,您会看到您期望的行为,至少我在 Glassfish3+ 环境中是这样做的。
关于jakarta-ee - 为什么 @SessionsScoped EJB 会在所有用户之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11807392/