5

現在のユーザー情報をアプリケーション内に保持するために使用しているステートフル EJB があります。この EJB はサーブレット コントローラーに挿入され、最後にログインしたユーザーを格納するために使用されます。ただし、セッションはすべてのクライアントで同じように見えます。

サンプル EJB コード:

Stateful
@LocalBean
public class CurrentUserBean {

private string Username;

public void setUser(String un)
{
    Username = un;
}

....

サンプル サーブレット コード:

public class MainController extends HttpServlet {
       @EJB private CurrentUserBean userBean;

        protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                HttpSession session = request.getSession();
                String name = session.getAttribute("username");

                userBean.setUser(name);
                ......

ここで、アプリケーションがサーバーにデプロイされ、さまざまなクライアントからさまざまな人がサーバーに話しかけている場合、ユーザー名は常に最後にログインしたユーザーに設定されます。つまり、ステートフル セッション Bean のように見えます。すべてのクライアントで同じ状態を維持しています。Java 6 eeチュートリアルで247ページからの次の引用を読んだので、これは私を大いに混乱させました。

ステートフル セッション Bean では、インスタンス変数は一意のクライアント/Bean セッションの状態を表します。クライアントはその Bean と対話 (「対話」) するため、この状態は多くの場合、会話状態と呼ばれます。その名前が示すように、セッション Bean はインタラクティブ セッションに似ています。セッション Bean は共有されません。インタラクティブ セッションが 1 人のユーザーしか持てないのと同じように、クライアントは 1 つしか持てません。クライアントが終了すると、そのセッション Bean は終了したように見え、クライアントに関連付けられなくなります。

誰かがなぜこれが発生しているのかを説明し、すべてのクライアントで同じ状態を維持しない適切な方法でステートフル Bean を使用する方法を説明できますか?

ありがとうございました。

4

2 に答える 2

6

ステートフル セッション Bean にはユーザー (実際にはセッション) ごとの状態がありますが、サーブレットにはありません。サーブレットが作成されたときに注入されるため、現在のように注入すると、単一の Bean がこのサーブレットによって使用されます (おそらく最初の訪問者に属する Bean)。

Bean を注入するのではなく、processRequestメソッド内のコンテキストから取得する必要があります。

InitialContext ctx= new InitialContext();
CurrentUserBean userBean = (CurrentUserBean)ctx.lookup("CurrentUserBean");
于 2011-12-16T16:12:05.963 に答える