2017-11-30 11 views
1

私はEEを使用していて、ユーザーセッション状態を維持したい。私はここでセッションBeanを持っている:GWT&Java EE SessionScoped Beanが永続しない

@Stateful(mappedName = "UserSessionState") 
@Named("UserSessionState") 
@SessionScoped 
@StatefulTimeout(value = 5, unit = TimeUnit.MINUTES) 
public class UserSessionState implements Serializable 
{ 
    private boolean hasPlayerId = false; 
    private String playerId = ""; 

    public void setRandomPlayerId() 
    { 
     playerId = UUID.uuid(); 
     hasPlayerId = true; 
    } 

    public boolean hasPlayerId() 
    { 
     return hasPlayerId; 
    } 

    public String getPlayerId() 
    { 
     return playerId; 
    } 
} 

そして、私はここにサーブレット(GameStateが期待どおりに動作しているアプリケーションスコープのBeanです、CustomExtendedHttpServletはHttpServletのの単純な拡張である)

public class NewUserJoined extends CustomExtendedHttpServlet 
{ 
    @Inject 
    protected GameState gameState; 

    @Inject 
    protected UserSessionState user; 

    @Override 
    protected String doGetImpl(HttpServletRequest request, HttpServletResponse response, UserContext userLoginContext) 
    { 
     if (!user.hasPlayerId()) 
     { 
      user.setRandomPlayerId(); 
     }   
     String userId = user.getPlayerId(); 

     if (!gameState.hasUser(userId)) 
     { 
      gameState.addUser(userId, user); 
      return "Hi, your ID is: " + user.getPlayerId() + ", there are " + gameState.getUserCount() + " other players here"; 
     } 
     else 
     { 
      return user.getPlayerId() + " you're already in the game, there are: " + gameState.getUserCount() + " other players here"; 
     } 
    } 
} 

何が起こっているのか分かりませんが、同じHTTPセッションからNew User Joinedサーブレットを呼び出すと、最初の呼び出しで(期待どおり)この応答が返されます:

「あなたのIDは:ここのプレーヤー "

同じセッションで同じサーブレット・コールを繰り返しは

私に同じメッセージを与える: 「こんにちは、あなたのIDは次のようになります、2人の他のプレイヤーがここにあります」 は...

これは、ユーザーの新しいインスタンスのように見えますセッションステートが何度も繰り返し作成されています。私はこれを正しくしていますか?

EDIT 1:ここではリクエストを送信するために使用するコードです。リクエストごとに新しいセッションIDが表示されているようですが、何が原因でしょうか?

RequestCallback callback = new RequestCallback() 
{ 
    @Override 
    public void onResponseReceived(Request request, Response response) 
    { 
     log(response.getText()); 
    } 

    @Override 
    public void onError(Request request, Throwable exception) 
    { 
     log(
      "Response Error | " 
      + "Exception: " + exception); 
    } 
}; 

RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, SERVLET_URL); 
rb.setCallback(callback); 

try 
{ 
    rb.send(); 
} 
catch (RequestException e) 
{ 
    log("Response Error | " 
     + "Exception: " + e); 
} 
+0

私はChrome Posterを使用していましたが、私のセッションは本当にそのツールから持続しています。しかし、ページ自体からの要求はありません。要求全体を1つの大きな文字列として記録し、それぞれの原点からの要求を比較して何が違うのかを確認する方法はありますか? – user3689186

+0

ブラウザ以外の環境でテストするときにセッションクッキーを保存/送信するクライアントを使用するように注意する必要があります。 – covener

+0

私はクライアントコードを開発するためにGWTを使用してきましたが、私が読んできたことから、クッキーを直接処理する必要はありません。 – user3689186

答えて

0

が問題を考え出し、

は、私がCORSの問題を回避するためにホストを変更したGWTクライアントの古い回避策を持っていたが判明します。応答が起点まで一致しなかったため、将来のサーブレットGET呼び出しでCookieが送信されませんでした。

0

EE HTTPSessionがここに設定されていることを確認するためにrequest.getSession(true)を呼び出そうとしましたか?

+0

request.getSession(true)は機能しますが、私は何を探しているのですか?それが助け場合 は、私がログイン: 'servletRequest.getSession(真).getId()' ]ボタンを一意のセッションIDを持っている私のサイト作成の要求から、クロームポスターは、同じセッションIDを使用していました。 何が新しいセッションをクライアント側から作成する可能性がありますか? (あなたがdownvotedなっている理由を確認してください、これは私にとって大きなリードしていない) – user3689186

+0

あなたのクライアントコードは、セッションクッキーを送信/保存していない可能性があります を(私の元の質問に編集1を参照)。 – covener

関連する問題