gpt4 book ai didi

java - 为什么我要在 Response Servlet 中对私有(private)成员使用 session ?

转载 作者:行者123 更新时间:2023-11-29 03:45:55 25 4
gpt4 key购买 nike

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

基本上,我想在处理我的 AJAX 响应的 servlet 中维护手部状态。我猜 servlet 中的成员变量不安全,而 session 应该是。您能否解释一下该解决方案的正确实现方式?

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();

最佳答案

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

您需要做的就是从 session 中保存/加载手部状态,每个用户对话都是唯一的1。删除手状态实例变量。

删除手状态 setter/getter 。仅在请求处理调用中处理手部状态,并将该手部状态传递给其他需要它的方法(如果有的话)。

您的代码会更接近于此:

protected void doGet(etc) {
HandState state = (HandState) request.getSession().getAttribute("handState");
state.nextState();
}

尽管我建议对 session 属性键使用常量。


1 这与每个浏览器窗口或标签的唯一性不同;如果您打开了多个窗口或选项卡,它们可能共享同一个 session 。

关于java - 为什么我要在 Response Servlet 中对私有(private)成员使用 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10906997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com