Ich versuche ein Anfrageprotokoll für meine Web-App zu erstellen. Ich benutze Frühling 3. 0.
Ich habe eine Klasse implementiert, die HandlerInterceptorAdapter
erweitert und die preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
verwendet, um die Anfrage abzufangen.
In der Methode möchte ich den Anfragetext protokollieren können (meine Parameter sind Objekte in XML, die direkt in den Anfragetext geschrieben werden), und dafür benutze ich request.getReader();
Das Problem ist - später bekomme ich IllegalStateException
, wenn der Federcontroller versucht, die Anfrage zu lesen.
Gibt es eine Möglichkeit, das zu tun, was ich vorhabe?
Sie können dies mit einem Filter tun. Die Anfrageparameter sind einfach zu handhaben. Der Umgang mit der Anfrage wird jedoch viel schwieriger und das Wrappern der Servlet-Anfrage erfordert: HttpServletRequest .
>Sie müssen sehen, wie groß die eingehende Anfrage ist und entscheiden, ob Sie den Anfragetext als tmp-Datei oder als Zeichenfolge speichern möchten.
Sie müssen ServetRequest.getInputStream () mit Ihrer Datei oder gespeicherten Zeichenfolge überschreiben, die für die Protokollierung verwendet wurde.
Wenn der Anfragetext riesig ist, empfehle ich, den Eingabestrom in einen gepufferten Eingabestream zu setzen und dann den Anfang des Textes zu lesen.
%Vor% Spring hat einen fertigen Filter, der das für Sie erledigt - siehe Verwendung von AbstractRequestLoggingFilter
und seiner Unterklassen, die in diese Antwort .
Beachten Sie, dass bei Verwendung dieser Lösung der Anfragetext erst protokolliert wird, nachdem die Anfrageverarbeitung abgeschlossen und der Text von Ihrer Anwendung gelesen wurde.
Tags und Links java spring-mvc httprequest