私は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);
}
私はChrome Posterを使用していましたが、私のセッションは本当にそのツールから持続しています。しかし、ページ自体からの要求はありません。要求全体を1つの大きな文字列として記録し、それぞれの原点からの要求を比較して何が違うのかを確認する方法はありますか? – user3689186
ブラウザ以外の環境でテストするときにセッションクッキーを保存/送信するクライアントを使用するように注意する必要があります。 – covener
私はクライアントコードを開発するためにGWTを使用してきましたが、私が読んできたことから、クッキーを直接処理する必要はありません。 – user3689186