Я создаю входное использование КАПЧИ 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
Как я создаю сессию на своем сервлете? Как я могу решить этот вопрос?
Большое спасибо.
Невозможно создать сеанс после совершенного ответа
Сообщение об исключении довольно четко. Есть средства нелегального государства. Вы не можете установить / изменить заголовки ответа, когда ответ уже был совершен. Ответ совершается, когда заголовки уже отправлены на стороне клиента. Это точка без возврата .
Реакция будет предана всякий раз, когда выходной сигнал напрямую был покрасен (в). Это может произойти, когда вы пишете более 2k до ответа (зависит от конфигурации сервера), или Flush ()
вручную или сделал Sendredirect ()
.
Всякий раз, когда необходимо создать сеанс, сервер должен установить файл cookie в заголовке ответа, чтобы он мог идентифицировать конкретный клиент и ассоциировать его с помощью экземпляра HTTPSESIDE
в памяти сервера. Но это невозможно, если ответ уже совершенствует, отсюда это исключение.
Вернуться к первонному причину этой проблемы:
Сервер. Service () для сервлета CAPTCHA бросил исключение
Это сервлет с именем
CAPTCHA
что вызвало эту проблему. Вам необходимо проверить / отладить всю цепь на ответ на запрос, чтобы увидеть, какие сервлеты / фильтры все вызывают, и какие из них могут совершить ответ до . CAPTCHA
Сервлена в состоянии создать сессия. Я не могу помочь вам больше, поскольку эта информация отсутствует в вашем TopicStart.
, по крайней мере, в данном конкретном примере кода я вижу, что вы без необходимости RACKING RACK.GETWRITER ()
. Я не уверен, как выглядит настоящий мировой код, возможно, вы наделили некоторые строки, но шансы состоят в том, что вы на самом деле пишете ему, и это может быть основной причиной проблемы. Если вы пишете слишком много или промывали на нем, то резопн будет предан. Сделайте [1197776] Написать на ответ внутри сервлета, который должен быть контроллером. Там вы обычно используете JSP для. Или если оно для целей отладки, используйте STDOUT ( System.out.println ()
) или в Logger .
Перемещение эта строка:
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");
//...
}
Это должно помочь.
Кажется, что вы уже отправили заголовок клиенту прежде, чем обработать сообщение. При создании сессии сервер должен отправить идентификатор сессии клиенту. Это обычно делается путем отправки cookie. Я предполагаю, что вы проверяете свой код на то, выполняете ли вы действие, обрабатывающее перед передачей чего-либо обратно клиенту.
Эта строка
(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, вы могли бы изучить?
создайте сессию, добавив следующее 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) {
...
}