GWT&;Java EE SessionScoped bean未持久化

GWT&;Java EE SessionScoped bean未持久化,session,jakarta-ee,gwt,cdi,Session,Jakarta Ee,Gwt,Cdi,我正在玩w/EE游戏,希望保持用户会话状态。我这里有会话bean: @Stateful(mappedName = "UserSessionState") @Named("UserSessionState") @SessionScoped @StatefulTimeout(value = 5, unit = TimeUnit.MINUTES) public class UserSessionState implements Serializable { private boolean ha

我正在玩w/EE游戏,希望保持用户会话状态。我这里有会话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;
    }
}
这里还有一个servlet(GameState是一个应用程序范围的bean,按预期工作,CustomExtendedHttpServlet只是HttpServlet的一个简单扩展)

我不确定发生了什么,但每当我从同一HTTP会话调用新用户加入的servlet时,我在第一次调用时就会得到这个响应(如预期的那样):

您好,您的ID是:,这里还有1名玩家

在同一会话中重复相同的servlet调用会给我相同的消息: 您好,您的ID是:,这里还有两位玩家

看起来用户会话状态的新实例正在一次又一次地创建。我这样做对吗

编辑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);
}

您是否尝试调用request.getSession(true)以确保在此处建立EE HTTPSession?

解决了问题


事实证明,我在GWT客户机中有一个旧的解决方法,它改变了主机以解决CORS问题。因为响应与源不匹配,所以cookie不会随将来的servlet GET调用一起发送。

我一直在使用Chrome Poster,我的会话确实会通过该工具持续。但是来自页面本身的请求却没有。有没有一种方法可以将整个请求记录为一个大字符串,并比较来自每个原点的请求,看看有什么不同?在非浏览器中进行测试时,您必须小心使用一个将保存/发送会话cookies的客户端。我一直在使用GWT开发客户端代码,但根据我所阅读的内容,您不应该直接处理w/cookies,因为它是在后台管理的?request.getSession(true)确实有效,但我不确定我在寻找什么?如果有帮助,我会记录:
servletRequest.getSession(true).getId()
我网站上的按钮生成了具有唯一会话id的请求,Chrome poster使用了相同的会话id。什么会导致从客户端创建新会话?(请参见我的原始问题的编辑1)(不确定您为什么会被否决,这对我来说是一个很好的线索)您的客户端代码可能没有保存/发送会话cookies。
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);
}