Ich erstelle eine CAPTCHA-Eingabe mit SimpleCaptcha und validiere die Captcha-Eingabe. Ich habe eine Captcha-Eingabe mit den folgenden Codes erstellt.
HTML-Code:
%Vor%JavaServlet-Code:
%Vor%Allerdings habe ich diesen Fehler immer erhalten:
%Vor%Wie erstelle ich eine Sitzung auf meinem Servlet? Wie kann ich dieses Problem beheben?
Vielen Dank.
Eine Sitzung kann nicht erstellt werden, nachdem die Antwort festgeschrieben wurde
Die Ausnahmebedingungsnachricht ist ziemlich klar. Es gibt Mittel eines illegalen Staates. Sie können die Antwortheader nicht mehr setzen / ändern, wenn die Antwort bereits festgeschrieben wurde. Eine Antwort wird festgeschrieben, wenn die Header bereits an die Clientseite gesendet wurden. Dies ist ein Punkt von keine Rückkehr .
Die Antwort wird festgeschrieben, wenn der Ausgabestream direkt (in) geleert wurde. Das kann passieren, wenn Sie mehr als 2K in die Antwort schreiben (hängt jedoch von der Serverkonfiguration ab), oder hat flush()
manuell ausgeführt, oder hat einen sendRedirect()
-Aufruf ausgeführt.
Wenn die Sitzung erstellt werden muss, muss der Server im Antwortheader einen Cookie setzen, damit er den bestimmten Client identifizieren und einer Instanz HttpSession
im Serverspeicher zuordnen kann. Aber das ist nicht möglich, wenn die Antwort bereits festgeschrieben ist, daher diese Ausnahme.
Zurück zur Grundursache dieses Problems:
Servlet.service () für Servlet Captcha hat Ausnahme
geworfen
Es ist das Servlet mit dem servlet-name
von Captcha
, das dieses Problem verursacht hat. Sie müssen die gesamte Request-Response-Kette überprüfen / debuggen, um zu sehen, welche Servlets / Filter alle aufgerufen wurden und welche von ihnen möglicherweise die Antwort festgeschrieben haben, bevor das Servlet Captcha
die Sitzung erstellen konnte. Ich kann Ihnen nicht weiter helfen, da diese Informationen in Ihrem Themenstart fehlen.
Zumindest in dem Codebeispiel, das bisher angegeben wurde, sehe ich, dass Sie unnötigerweise aufrufen, um response.getWriter()
aufzurufen. Ich bin mir nicht sicher, wie der Code der realen Welt aussieht, vielleicht haben Sie einige Zeilen entfernt, aber die Wahrscheinlichkeit ist groß, dass Sie tatsächlich daran schreiben und das könnte die Ursache des Problems sein. Wenn Sie zu viel schreiben oder einen Flush machen, wird der Resopnse ausgeführt. Schreiben Sie nicht in die Antwort eines Servlets, das ein Controller sein soll. Dort benutzt man normalerweise die JSP für. Oder, wenn es zu Debugging-Zwecken ist, verwenden Sie den stdout ( System.out.println()
) oder einen Logger .
Der Fehlercode ist in nl.captcha.servlet.SimpleCaptchaServlet
Servlet. Wenn Sie es in StickyCaptcha
ändern, wird das Problem verschwinden, aber speziell die folgenden Zeilen sind im SimpleCaptcha Servlet problematisch.
Tatsächlich schreibt der Code die Bilddatei in die Antwort (die normalerweise größer ist als die Standard 2k).
So können Sie vorläufig das StickyCaptcha
verwenden oder den Code auschecken und das Problem beheben.
Scheint, dass Sie den Header bereits an den Client gesendet haben, bevor Sie den Post bearbeiten. Wenn Sie eine Sitzung erstellen, muss der Server die Sitzungs-ID an den Client senden. Dies geschieht in der Regel durch Senden eines Cookies. Ich nehme an, dass Sie Ihren Code überprüfen, ob Sie die Aktionsbearbeitung ausführen, bevor Sie etwas zurück an den Client senden.
Diese Zeile
%Vor%bedeutet, dass die Sitzung bereits existieren sollte, bevor diese bestimmte Anfrage verarbeitet wird. Daher frage ich mich, ob es eine Initialisierung gibt, die Sie vor dem Senden Ihres ursprünglichen Formulars durchführen sollten. Dies sollte durch das Framework festgelegt werden, das Sie verwenden.
Zum Beispiel könnten Sie eine erste servvet das
haben %Vor%Sie könnten das alles in einer JSP machen, oder Sie könnten Ihr Servlet zu einem weiterleiten lassen.
Gibt es Beispiele für die Verwendung dieser Catcha-Bibliothek, die Sie untersuchen könnten?
Tags und Links session servlets glassfish captcha simplecaptcha