会话属性被复制用于不同的用户会话

问题描述 投票:0回答:1

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

这是我如何将值添加到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);
                }
            }

        }
java jsp session servlets
1个回答
0
投票

您最后的评论是您的问题的答案。您在一个只在Web应用程序中只有一个实例的类中实例化rbList。因此,您只有一个rbList可以覆盖所有客户,这会导致您的问题。虽然我没有非常清楚地了解你的rbList是如何工作的,但我相信每个客户都应该拥有自己独特的rbList或者至少是他们自己的购物车。

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

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

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

如果您更喜欢使用此设计,最好将CartModel保存到您的数据库或会话中。

我希望我帮忙。

© www.soinside.com 2019 - 2024. All rights reserved.