Captcha servlet Ursachen java.lang.IllegalStateException: PWC3999: kann Nicht erstellen Sie eine Sitzung nach der Antwort begangen wurde
Erstelle ich ein CAPTCHA-Eingabe mit SimpleCaptcha, und habe die Validierung der Captcha Eingabe. Ich bin geschaffen, einer captcha-Eingabe mit dem folgenden codes.
HTML-Code:
<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-Code :
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);
}
Jedoch hielt ich immer diese Fehlermeldung:
StandardWrapperValve[Captcha]: PWC1406: Servlet.service() for servlet Captcha threw exception
java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed
Wie erstelle ich eine session auf meinem servlet? Wie kann ich dieses Problem beheben?
Danke Ihnen sehr.
- Woher erhalten Sie die Sitzung aus? sind es einige wichtige Teile Ihrer Methode fehlt? Wo ist
HttpSession session = request.getSession();
oder ähnliches? wie kann Sie erwerben session-Objekt? - Ich glaube, ich versehentlich gelöscht, diese nach Prüfung, zum code Hinzugefügt, HttpSession session = request.getSession(true);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die exception message ist ziemlich klar. Es ist ein illegaler Staat. Sie können nicht einstellen/ändern der Antwort-Header nicht mehr, wenn die Antwort bereits begangen wurde. Eine Antwort ist verpflichtet, wenn die Header bereits an den client gesendet Seite. Dies ist ein Punkt, der no return.
Die Antwort wird begangen, wenn der Ausgabestrom wurde gespült (in)direkt. Das kann passieren, wenn Sie schreiben, mehr als 2K auf die Antwort (abhängig von der server-Konfiguration gibt es jedoch nicht), oder hat
flush()
manuell, oder hat einesendRedirect()
nennen.Wenn die Sitzung erstellt werden muss, muss der server ein cookie im response-header, so dass Sie es identifizieren können, die bestimmten Kunden, und assoziieren Sie ihn mit einem
HttpSession
Instanz im server-Speicher. Aber das ist nicht möglich, wenn die Antwort bereits verpflichtet, daher diese Ausnahme.Zurück auf die Ursache des Problems:
Ist es die servlet mit der
servlet-name
vonCaptcha
die dieses problem verursacht hat. Sie müssen schauen/Debuggen die gesamte Anfrage-Antwort-Kette, um zu sehen, welche servlets/Filter sind alle aufgerufen und die von Ihnen möglicherweise begangen haben, die Antwort vor dieCaptcha
servlet in der Lage war, um die Sitzung zu erstellen. Ich kann dir nicht helfen, weiter als diese information fehlt in deiner topicstart.Zumindest in soweit gegeben-code-Beispiel sehe ich, dass Sie unnötig aufrufen
response.getWriter()
. Ich bin nicht sicher, wie der realen Welt code Aussehen, vielleicht sind Sie ausgezogen habe einige der Linien, aber die Chancen sind, dass Sie tatsächlich schreiben, und das könnte die Ursache des Problems. Wenn Sie zu viel schreiben oder hast einen flush, dann werden die resopnse begangen werden. Tun nicht schreiben Sie die Antwort in ein Servlet, das ist eigentlich ein controller. Da Sie in der Regel in das JSP für. Oder wenn Sie es für debugging-Zwecke ist die stdout (System.out.println()
) oder eine Logger.Den fehlerhaften code in
nl.captcha.servlet.SimpleCaptchaServlet
Servlet. Wenn Sie es ändern, umStickyCaptcha
das problem wird Weggehen, aber insbesondere die folgenden sind die fehlerhaften Zeilen in SimpleCaptcha Servlet.Tatsächlich den code schreiben der image-Datei auf Antwort (das ist in der Regel größer als Standard-2k).
Also für die Zeit, die Sie verwenden können, die
StickyCaptcha
oder checkout den code und das Problem zu beheben.Verschieben Sie diese Zeile:
erste Anweisung in der doPost-Methode.
Helfen sollte.
Scheint, dass Sie bereits gesendeten header an den client, bevor Sie mit der post. Wenn Sie eine Sitzung erstellen, den server senden muss, um die session-ID an den client. Dies geschieht in der Regel durch das senden einer cookie. Ich nehme an, Sie überprüfen Sie Ihren code für Sie, ob Sie die Aktion auszuführen Handhabung, bevor Sie senden Sie alles an den client zurück.
erstellen Sie die Sitzung, indem diese
javax.- servlet.http.HttpSession session = request.getSession();
Diese Zeile
impliziert, dass die Sitzung sollte bereits vorhanden sein, bevor diese Besondere Anforderung verarbeitet wird, daher Frage ich mich, ist die Initialisierung, die Sie tun sollen, vor dem senden Ihrer ursprünglichen form. Dies sollte angegeben werden, indem die Rahmen, die Sie verwenden.
Zum Beispiel könnten Sie haben eine erste serlvet, dass
Sie tun könnte, dass alle in einer JSP, oder könnten Sie Ihre servlet weiterleiten an ein.
Gibt es Beispiele für die Nutzung dieses catcha Bibliothek, die Sie untersuchen könnten?