HttpSessionListener
здесь не требуется. Все, что вам в основном нужно сделать в сервлете:
List<String> links = (List<String>) request.getSession().getAttribute("links");
if (links == null) {
links = new ArrayList<String>();
request.getSession().setAttribute("links", links);
}
links.add(request.getParameter("link"));
Атрибуты будут использованы в любом случае, когда сеанс будет уничтожен.
JSON только добавляет ненужные накладные расходы, а база данных полезна только тогда, когда в веб-сервере недостаточно места для памяти (однако, БД, в свою очередь, также потребляет память в определенной степени).
Мне только интересно, как вы думаете поддерживать ту же сессию сервлета с PHP. Это может включать вызов сервлета с использованием атрибута JSESSIONID в URL (плохая идея) или сценария PHP с curl, выступающим в качестве прокси (почему бы просто не сделать все это в PHP?). Или он работает в том же домене? Или вы используете Quercus для запуска PHP на сервлет-контейнере Java?