【问题标题】:GWT & Java EE SessionScoped bean not persistingGWT 和 Java EE SessionScoped bean 不持久
【发布时间】:2017-11-30 16:37:36
【问题描述】:

我正在玩 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 是一个 Application Scoped 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 会话调用新用户加入的 servlet 时,我都会在第一次调用时得到这个响应(如预期的那样):

“你好,你的ID是:,这里还有1个玩家”

在同一个会话中重复同一个 servlet 调用会给我同样的信息: “你好,你的ID是:,这里还有2个玩家” ...

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

编辑 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 海报,我的会话确实从该工具中持续存在。但是来自页面本身的请求却没有。有没有办法将整个请求记录为一个大字符串并比较来自每个源点的请求以查看有什么不同?
  • 在非浏览器中进行测试时,您必须小心使用将保存/发送会话 cookie 的客户端。
  • 我一直在使用 GWT 开发客户端代码,但从我所阅读的内容来看,您不应该直接处理 cookie,因为它是在后台管理的?

标签: session jakarta-ee gwt cdi


【解决方案1】:

解决了问题,

原来我在 GWT 客户端中有一个旧的解决方法,它正在更改主机以解决 CORS 问题。因为响应与源不匹配,cookie 没有通过未来的 servlet GET 调用发送。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • request.getSession(true) 确实有效,但我不确定我在寻找什么?如果有帮助,我记录了:servletRequest.getSession(true).getId() 我网站上的按钮产生了具有唯一会话 ID 的请求,Chrome 海报使用了相同的会话 ID。什么可能导致从客户端创建新会话? (请参阅我原来的问题的编辑 1)(不知道为什么你会被否决,这对我来说是一个很好的线索)
    • 您的客户端代码可能没有保存/发送会话 cookie。
    猜你喜欢
    • 2013-06-30
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2017-02-22
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多