【问题标题】:session attributes getting replicated for different user sessions为不同的用户会话复制会话属性
【发布时间】:2019-07-06 04:20:39
【问题描述】:

我正在构建一个在线酒店预订系统。为此,我使用了一个预订车,我在其中跟踪用户添加的房间。当我在浏览器中添加一些房间时,使用 user1 登录,现在当我使用其他浏览器使用 user2 登录并在购物车中添加一些其他房间时。现在,当我尝试在 user1 的购物车中添加另一个房间时,user1 的现有购物车将被 user2 的购物车值替换。我为每个用户维护不同的会话,但所有会话的购物车属性都相同。我目前正在本地主机上工作。请帮忙

这就是我向 rbList 添加值并设置会话属性的方式。

if(request.getParameter("button").equals("addRoom"))
        {   // System.out.println("******************inside addRoom*****************");
            if(session!=null)
            {   

                availableRooms = (ArrayList<HotelBean>)session.getAttribute("availableRooms");

                int addPos = Integer.parseInt(request.getParameter("roomPosition"));
                rb = availableRooms.get(addPos);
                String roomID = rb.getRoomId();
                HoteDAO hd = new HoteDAO();
                boolean available = hd.isAvailable(roomID);
                if(available){
                    if((ArrayList<HotelBean>)session.getAttribute("ReservationCart") == null){
                        rbList = new ArrayList<HotelBean>();
                    }
                    if(rbList == null){
                        rbList = new ArrayList<HotelBean>();
                    }
                    rbList.add(rb);
                    for(HotelBean room : rbList){
                        System.out.println(room.getRoomId());
                    }
                    session.setAttribute("ReservationCart",rbList);
                    RequestDispatcher rd=request.getRequestDispatcher("/AvailableRooms.jsp");
                    rd.forward(request,response);
                }
                else
                {
                    System.out.println("Sorry the room is not available now");
                    RequestDispatcher rd=request.getRequestDispatcher("/AvailableRooms.jsp");
                    rd.forward(request,response);
                }
            }

        }

【问题讨论】:

  • 从您的描述看来您只有一个购物车实例,您将客户购物车保存在哪里?
  • @Dimitris 如何为不同的客户定义不同的购物车。我只是在我的 servlet 代码中将购物车(ArrayList)定义为类变量。它不会为每个会话创建不同的实例吗?
  • 它应该,虽然我觉得把它放在一个实际的数据库中更安全,但会话可以被删除。我只是看不到你在哪里声明了你的变量 rblist,如果你用它做了一个 bean,一个明显的错误方法就是。
  • [ .包main.controller;公共类 HotelReservationContoller 扩展 HttpServlet { ArrayList rbList=new ArrayList(); ArrayListavailableRooms = new ArrayList();公共 HotelReservationContoller() { super(); } ] 。这是我定义列表的地方。上面共享的 doPost 方法在这个类中
  • 你为 HotelReservationContoller 制作了一个 bean 吗?

标签: java jsp session servlets


【解决方案1】:

您的最后一条评论是您问题的答案。您在整个 Web 应用程序中只有一个实例的类中实例化 rbList。因此,您在所有客户中只有一个 rbList ,这会导致您的问题。 尽管我对您的 rbList 的工作方式不是很清楚,但我相信每个客户都应该拥有自己独特的 rbList 或至少拥有自己的购物车。

此外,在控制器中声明客户购物车似乎是一个糟糕的设计选择。

解决您的问题的方法是创建一个单独的 CartModel 类,其中包含与购物车相关的所有内容。

创建从 CustomerModel 到 CartModel 的一对一或一对多关系。

如果您更喜欢这种设计,最好将 CartModel(s) 保存到您的数据库或会话中。

希望我能帮上忙。

【讨论】:

  • 感谢您的帮助。我是 java 新手。我会努力改进我的模型。顺便说一句,我对代码进行了一些更改,之前我使用不同的 servlet 进行登录/注销/注册,而对于所有其他功能,我使用的是 HotelReservationContoller。在改变我所做的之后,我在 HotelReservationController 中添加了这些差异控制器的所有代码,问题得到了解决。
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 2011-02-12
  • 2011-07-09
  • 2012-01-14
  • 2017-05-17
  • 2014-11-11
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多