Я работаю над проектом домашней работы, где мы реализуем сеансы (не могу использовать HTTPSession), используя файлы cookie и сохраняя данные сеансов. Мы должны хранить в памяти, а не во внешней базе данных.
Для сохранения глобальности для экземпляра и безопасности потоков у меня есть одноэлементный класс SessionTable, который содержит синхронизированный LinkedHashMap объектов SessionData.
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, я попробовал этот метод использования слушателя (вместо добавления таблицы в конструктор сервлета, который не работал). Я тоже добавил его в свой web.xml.
@WebListener
public class ServletListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent arg0) {
arg0.getServletContext().setAttribute("table", SessionTable.getInstance());
}
}
В принципе, я думаю, что моя логика работает правильно, чтобы хранить все нужные мне значения в куки, но ничего из этого не сохраняется в таблице, поэтому, когда приходит новый запрос, он думает, что это новый пользователь, и всегда дает назад совершенно новое печенье. Что я делаю неправильно? Как я могу сохранить это между запросами?