1

私は自分のJavaスキルに取り組むための小さなポーカーアプリを構築しています。テキサスホールデム形式で作成しています。

基本的に、AJAX応答を処理するサーブレットで手の状態を維持したいと思います。サーブレットのメンバー変数は安全ではないと思いますが、セッションは安全であるはずです。このソリューションの正しい実装について説明していただけますか?

public class PokerClientResponse extends HttpServlet {
private static Logger LOG = Logger.getLogger(PokerClientResponse.class);

private static final long serialVersionUID = 1L;
private HandState handState = null;

public PokerClientResponse() {
    super();
}

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
            //Which is the best way to maintain hand state?

    //Get the State from the session, then increment it
    HttpSession session = request.getSession();
    Object obj = session.getAttribute("handState");

            //Advance the Hand State
    getHandState().goToNextState();
4

2 に答える 2

3

サーブレットインスタンス変数(それThreadLocalが実際に安全でない場合を除きます。これは、マッピングに対して行われたすべての要求を処理するサーブレットインスタンスが1つしかないためです。

あなたがする必要があるのは、セッションから手の状態を保存/ロードすることです。これは、ユーザーの会話ごとに一意です1。ハンド状態インスタンス変数を削除します。

ハンドステートゲッターを取り外します。リクエスト処理呼び出し内でのみハンド状態を処理し、そのハンド状態をそれを必要とする他のメソッド(存在する場合)に渡します。

あなたのコードはこれに近いでしょう:

protected void doGet(etc) {
    HandState state = (HandState) request.getSession().getAttribute("handState");
    state.nextState();
}

セッション属性キーには定数を使用することをお勧めしますが。


1ブラウザウィンドウまたはタブごとの一意とは異なります。複数のウィンドウまたはタブを開いている場合は、それらが同じセッションを共有している可能性があります。

于 2012-06-06T01:09:01.487 に答える
1

手始めに、HTTPはもともとステートレスプロトコルとして意図されていました。それは起源のためです...

次に、コードを確認する場合は、次のことを自問してください。VisitorBがVisitorAのセッションにアクセスできますか?

ヒント:おそらくそうではありません。

だから、あなたは正しいと思います。1人のユーザーのセッションの単一性を管理する必要があります。組み込みのセッション管理により、これが可能になります。

于 2012-06-06T01:10:54.793 に答える