Хранить хранилище файлов cookie HashMap в сервлете через запросы - PullRequest
1 голос
/ 12 марта 2012

Я работаю над проектом домашней работы, где мы реализуем сеансы (не могу использовать 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());
    }
}

В принципе, я думаю, что моя логика работает правильно, чтобы хранить все нужные мне значения в куки, но ничего из этого не сохраняется в таблице, поэтому, когда приходит новый запрос, он думает, что это новый пользователь, и всегда дает назад совершенно новое печенье. Что я делаю неправильно? Как я могу сохранить это между запросами?

1 Ответ

2 голосов
/ 12 марта 2012

Я не вижу никакого кода, сохраняющего некоторые значения в вашей таблице, однако весь код выглядит хорошо (я имею в виду, что должен быть один экземпляр таблицы). Пересылает ли ваш клиент ранее полученные файлы cookie (заголовок Cookie)? В противном случае он будет рассматриваться как новый клиент, отправляющий запрос в первый раз.

...