Как и другие люди говорили, вы действительно хотите избежать этого в первую очередь. Вам может понравиться хорошая модель MVC, где у вас есть несколько сервлетов, которые выполняют вашу тяжелую работу, например, базы данных, куки и все такое, а затем передают управление JSP, который фактически отображает ответ. Поскольку JSP не вызывается для генерации HTML до тех пор, пока ваши сервлеты не будут созданы, вы не должны испытывать такое горе.
Это отстойно, что setCookie не сообщает вам, когда он терпит неудачу, но также имеет смысл, что, вероятно, вы не хотите, чтобы он ломал всю вашу страницу. ServletResponse.isCommitted () скажет вам, если заголовки уже записаны, и, следовательно, если ваш вызов setCookie () не удастся.
Если вы находитесь в тяжелом положении и вам абсолютно необходимо это сделать (пока вы ищете лучшее решение), вы можете создать фильтр сервлетов для буферизации ответа в памяти до тех пор, пока не будет установлен ваш файл cookie. Шаблон будет выглядеть примерно так:
doFilter(request, response, chain)
{
BufferedResponse bufferedResponse = new BufferedResponse(response);
try
{
// pass control to the next filter or to the JSP/servlet servicing the request
chain.doFilter(request, bufferedResponse);
}
finally
{
bufferedResponse.flush();
}
}
BufferedResponse должен был бы реализовать HttpServletResponse и в основном хранить все в памяти, пока вы явно не очистите его. В этот момент будут записаны заголовки, файлы cookie и тело буферизованного ответа.
Это будет полностью работать, но это заставит ваш веб-сервер использовать кучу дополнительной памяти, поскольку он должен буферизовать все тело ответа в памяти для каждого запроса. Кроме того, ваши страницы будут загружаться медленнее, так как сервер не может начать отправку чего-либо в браузер клиента, пока ваша страница не будет полностью завершена. Плохой юджу, мой друг.