3

私はここに何かが欠けていると確信しています..しかし、私はセッションスコープのEJBを持っています:

@javax.inject.Named
@javax.ejb.Stateful
@javax.enterprise.context.SessionScoped
public class Authenticator implements Serializable
{
...

HTTP セッションごとに、この EJB の異なるインスタンスが表示されると思いますか?

ただし、複数のブラウザー (異なるマシン上を含む) から JSF ページにアクセスすると、

#{authenticator.hashCode()}

それらのすべて(そしてもちろんクラスのメンバー属性)で同じです。これはなぜでしょうか?( @Stateful アノテーションを削除して実験しましたが、同じことが当てはまります)。

JBoss AS 7.1.0 を使用しています。

編集:Authenticatorでメソッドを作成することを発見しました:

public void getHashCode()
{
   return hashCode();
}

ELでこれを次のように参照します

#{authenticator.hashCode()}

Bean のさまざまなインスタンスに実際にアクセスしていることを示しています。しかし、これはなぜですか?これら 2 つの EL 式の結果が異なる理由がわかりません。

4

1 に答える 1

0

表示されている動作は、認証されていない HTTP セッションと一致しているため、認証が設定されていないと思います。したがって、コードに次を追加すると

@Resource
private EJBContext ctx;

public Principal getPrincipal() {
    return this.ctx.getCallerPrincipal();
}

テストページに追加します

<h:outputText value="#{test.principal}" />
<h:outputText value="#{test.hashCode()}" />

常に同じ出力が表示されます。EJB コンテナーに対しては、ローカル呼び出しではクライアントが実際にはサーブレット コンテナーであるため、常に同じ出力が表示されますANONYMOUS{your hash code here}ANONIMOUSクライアントは常に同じ (サーブレット コンテナー) であるため、認証されていない各 http セッションは 1 つの EJB セッションとしてカウントされます。

ある種の認証を設定してみると、期待どおりの動作が見られるはずです。少なくとも、Glassfish3+ 環境ではそうしています。

于 2012-11-05T14:35:47.193 に答える