Сервлет капчи вызывает java.lang. IllegalStateException: PWC3999: не Может создать сессию после того, как ответ фиксировался

Я создаю входное использование КАПЧИ SimpleCaptcha и сделал проверку входа Капчи. Я создаюсь вход капчи со следующими кодами.

HTML-код:

<form action="submit_proceed.do" method="post">
<img src="captchaImg" /><input type="text" name="captcha" value=""><br />
<input type="submit" value="Submit" name="submit" />
</form>

Код JavaServlet:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Iterator;
import nl.captcha.Captcha;

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

List errorMsgs = new LinkedList();
try{
    // Validate Captcha
    HttpSession session = request.getSession(true);
    String userCaptcha = request.getParameter("captcha");
    Captcha captcha = (Captcha) session.getAttribute(Captcha.NAME);
    if (!captcha.isCorrect(userCaptcha)) {
        errorMsgs.add("Please input the correct Captcha value.");
    }
} catch (RuntimeException e) {
    errorMsgs.add("An unexpected error: " + e.getMessage());
    RequestDispatcher view = request.getRequestDispatcher("/error.view");
    view.forward(request, response);
}

Однако я продолжал получать эту ошибку:

StandardWrapperValve[Captcha]: PWC1406: Servlet.service() for servlet Captcha threw exception
java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed

Как я создаю сессию на своем сервлете? Как я могу решить этот вопрос?

Большое спасибо.

7
задан BalusC 28 January 2016 в 14:55
поделиться

5 ответов

Невозможно создать сеанс после совершенного ответа

Сообщение об исключении довольно четко. Есть средства нелегального государства. Вы не можете установить / изменить заголовки ответа, когда ответ уже был совершен. Ответ совершается, когда заголовки уже отправлены на стороне клиента. Это точка без возврата .

Реакция будет предана всякий раз, когда выходной сигнал напрямую был покрасен (в). Это может произойти, когда вы пишете более 2k до ответа (зависит от конфигурации сервера), или Flush () вручную или сделал Sendredirect () .

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

Вернуться к первонному причину этой проблемы:

Сервер. Service () для сервлета CAPTCHA бросил исключение

Это сервлет с именем CAPTCHA что вызвало эту проблему. Вам необходимо проверить / отладить всю цепь на ответ на запрос, чтобы увидеть, какие сервлеты / фильтры все вызывают, и какие из них могут совершить ответ до . CAPTCHA Сервлена ​​в состоянии создать сессия. Я не могу помочь вам больше, поскольку эта информация отсутствует в вашем TopicStart.

, по крайней мере, в данном конкретном примере кода я вижу, что вы без необходимости RACKING RACK.GETWRITER () . Я не уверен, как выглядит настоящий мировой код, возможно, вы наделили некоторые строки, но шансы состоят в том, что вы на самом деле пишете ему, и это может быть основной причиной проблемы. Если вы пишете слишком много или промывали на нем, то резопн будет предан. Сделайте [1197776] Написать на ответ внутри сервлета, который должен быть контроллером. Там вы обычно используете JSP для. Или если оно для целей отладки, используйте STDOUT ( System.out.println () ) или в Logger .

16
ответ дан 6 December 2019 в 10:00
поделиться

Перемещение эта строка:

HttpSession session = request.getSession(true);

, чтобы быть первым оператором в doPost методе.

protected void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {

  HttpSession session = request.getSession(true);

  response.setContentType("text/html;charset=UTF-8");

  //...
}

Это должно помочь.

1
ответ дан 6 December 2019 в 10:00
поделиться

Кажется, что вы уже отправили заголовок клиенту прежде, чем обработать сообщение. При создании сессии сервер должен отправить идентификатор сессии клиенту. Это обычно делается путем отправки cookie. Я предполагаю, что вы проверяете свой код на то, выполняете ли вы действие, обрабатывающее перед передачей чего-либо обратно клиенту.

0
ответ дан 6 December 2019 в 10:00
поделиться

Эта строка

 (Captcha) session.getAttribute(Captcha.NAME);

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

Например, у вас может быть начальный серльвет, который

 creates the image, figures out the value of Capcha.Name
 creates the session 
 session.setAttribute(Capcha.NAME, theName)
 emit the html (or forward() to a JSP)

вы могли бы сделать это все в JSP, или вы могли бы иметь ваш сервлет вперед к одному.

Есть ли какие-либо примеры использования этой библиотеки Catcha, вы могли бы изучить?

0
ответ дан 6 December 2019 в 10:00
поделиться

создайте сессию, добавив следующее javax.servlet.http.HttpSession session = request.getSession();


try{ 
 javax.servlet.http.HttpSession session = request.getSession();
    // Validate Captcha 
    String userCaptcha = request.getParameter("captcha"); 
    Captcha captcha = (Captcha) session.getAttribute(Captcha.NAME); 
    if (!captcha.isCorrect(userCaptcha)) { 
        errorMsgs.add("Please input the correct Captcha value."); 
    } 
} catch (RuntimeException e) { 
    ... 
} 
0
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: