在请求中的Servlet中存储HashMap Cookie存储库

时间:2012-03-11 21:37:02

标签: java session web-applications servlets

我正在做一个家庭作业项目,我们使用cookie实现会话(不能使用HTTPSession)并存储会话数据。我们应该存储在内存中而不是外部数据库中。

为了使实例和线程安全保持全局,我有一个单例类SessionTable,它包含SessionData对象的同步LinkedHashMap。

SessionTable

public class SessionTable implements Serializable{
    private static final long serialVersionUID = 3563658006793791512L;
    private Map<String, SessionData> table;
    private SessionTable(){
        this.table = Collections.synchronizedMap(new ExpiryLinkedHashMap<String, SessionData>());
    }
    private static class SessionTableHolder { 
        public static final SessionTable instance = new SessionTable();
    }


    public static SessionTable getInstance() {
        return SessionTableHolder.instance;
    }
}

SessionSaver Servlet

public class SessionSaver extends HttpServlet {
    public SessionSaver() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        SessionTable sessionTable = (SessionTable) getServletContext().getAttribute("table");
        [...]
    }
}

ServletListener

基于SO的另一个问题我尝试了这种使用监听器的方法(而不是在Servlet的构造函数中添加表,这不起作用)。我也在我的web.xml中添加了它。

@WebListener
public class ServletListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent arg0) {
        arg0.getServletContext().setAttribute("table", SessionTable.getInstance());
    }
}

基本上,我认为我的逻辑工作正常,可以存储我在cookie中需要的所有值,但这些都不会持久存在于表中,所以当一个新请求进来时,它会认为它是一个新用户,并且始终给出支持一个全新的cookie。我究竟做错了什么?如何在请求之间保存?

1 个答案:

答案 0 :(得分:2)

我没有看到任何代码在表中保存一些值,但整个代码看起来很好(我的意思是应该有一个表的实例)。您的客户是否重新发送以前收到的cookie(Cookie标题)?否则,它将被视为新客户端,第一次发送请求。