1

我正在构建一个小型扑克应用程序来提高我的 java 技能。我正在以德州扑克格式创建它。

基本上我想在处理我的 AJAX 响应的 servlet 中保持手状态。我猜 servlet 中的成员变量是不安全的,而会话应该是。你能解释一下这个解决方案的正确实现吗?

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

一个 servlet 实例变量(除非它ThreadLocal确实是不安全的,因为只有一个 servlet 实例服务于对其映射的所有请求。

您需要做的就是从会话中保存/加载手部状态,这对于每个用户会话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 的会话吗?

提示:可能不会。

所以,你猜对了。您需要为一个用户管理会话的唯一性。内置的会话管理为您提供了这一点。

于 2012-06-06T01:10:54.793 回答