Wie kann ich den Anfragetext mehrfach im Spring 'HandlerMethodArgumentResolver' lesen?

8

Ich versuche, einige bestimmte Parameter von RequestMapping Methoden aufzulösen, um Werte aus dem Anfragetext zu extrahieren und zu validieren und in bestimmte annotierte Parameter einzufügen.

%Vor%

Das größte Problem ist, dass ich feststelle, dass HttpServletRequest (get from NativeWebRequest ) den Eingabestream nicht lesen kann (einige Parameter sind im Anfragetext enthalten) mehr als einmal . Wie kann ich Inputstream / Reader oder den Anfragetext mehr als einmal abrufen?

    
Kim 15.01.2016, 04:02
quelle

1 Antwort

16

Sie können einen Filter hinzufügen, den aktuellen HttpServletRequest abfangen und in eine benutzerdefinierte HttpServletRequestWrapper umbrechen. In Ihrem benutzerdefinierten HttpServletRequestWrapper lesen Sie den Anfragetext und cachen ihn und implementieren dann getInputStream und getReader , um vom zwischengespeicherten Wert zu lesen. Da nach dem Umbrechen der Anforderung der zwischengespeicherte Wert immer vorhanden ist, können Sie den Anforderungshauptteil mehrmals lesen:

%Vor%

Nach diesem Filter wird jedem wrappedRequest angezeigt, das mehrere Male gelesen werden kann:

%Vor%

Um MultipleReadHttpRequest zu implementieren, können Sie sich ContentCachingRequestWrapper vom Spring-Framework, das im Grunde dasselbe tut.

Dieser Ansatz hat seine eigenen Nachteile. Zunächst ist es etwas ineffizient, da der Anfragetext für jede Anfrage mindestens zweimal gelesen wird. Der andere wichtige Nachteil ist, wenn Ihr Anfragetext 10 GB Wert des Streams enthält, lesen Sie diese 10 GB Daten und noch schlimmer bringen Sie diese in den Speicher für weitere Untersuchungen.

    
Ali Dehghani 15.01.2016, 08:23
quelle

Tags und Links