我正在做一个家庭作业项目,我们在其中使用cookie并存储会话数据来实现会话(不能使用HTTPSession)。我们应该存储在内存中,而不是外部数据库。
为了使实例保持全局性和线程安全性,我有一个单例类SessionTable,其中包含SessionData对象的同步LinkedHashMap。
会话表
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。我究竟做错了什么?如何在请求之间保存此内容?
最佳答案
我看不到任何代码在您的表中保存一些值,但是整个代码看起来都不错(我的意思是应该有一个表实例)。您的客户端是否重新发送以前收到的cookie(Cookie
标头)?否则,它将被视为新客户端,第一次发送请求。