java - 跨请求将 HashMap Cookie 存储库存储在 Servlet 中

标签 java session web-applications servlets

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

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

session 表

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");
        [...]
    }
}

Servlet监听器

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

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

基本上,我认为我的逻辑工作正常,可以将我需要的所有值存储在 cookie 中,但是这些值都不会保留在表中,因此当新请求传入时,它会认为它是一个新用户,并且总是给出返回一 block 全新的 cookies 。我究竟做错了什么?我怎样才能在请求之间保存它?

最佳答案

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

关于java - 跨请求将 HashMap Cookie 存储库存储在 Servlet 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9659123/

相关文章:

java - 如何将条码扫描器与 Web 应用程序连接?

usability - Web 应用程序的主页应该是什么?

java - 在重复控件数据绑定(bind)和行属性之间共享计算

java - 从类名创建列表或按列表转换

ruby-on-rails - Rails session_store 多个域

session - Gorilla Sessions - 如何根据请求自动更新 Cookie 过期时间?

java - Apache Camel SNMP 组件

java - 如何使我的 if 语句再次运行,就像 if-else 语句运行一样?

php - 使用 session 生成的信息更新 mysql 表

java - 将多个上下文根映射到 application.xml 中的一个 web-uri