Captcha-Servlet verursacht java.lang.IllegalStateException: PWC3999: Nach dem Festschreiben der Antwort kann keine Sitzung erstellt werden

7

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.

    
jl. 13.01.2010, 09:07
quelle

6 Antworten

16
  

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 .

    
BalusC 13.01.2010, 11:42
quelle
2

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.

%Vor%

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.

    
quelle
1

Verschiebe diese Zeile:

%Vor%

als erste Anweisung in der doPost-Methode.

%Vor%

Das sollte helfen.

    
WildWezyr 13.01.2010 09:33
quelle
0

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.

    
cafebabe 13.01.2010 09:22
quelle
0

Erstellen Sie eine Sitzung, indem Sie diese hinzufügen javax.servlet.http.HttpSession session = request.getSession ();

%Vor%     
valli 13.01.2010 09:25
quelle
0

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?

    
djna 13.01.2010 09:28
quelle