現在のユーザー情報をアプリケーション内に保持するために使用しているステートフル 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 を使用する方法を説明できますか?
ありがとうございました。