Ein Anbieter hat XML-Daten über HTTPS innerhalb einer Formularvariablen mit dem Namen XMLContent an meinen Coldfusion-Anwendungsserver gesendet. Ich bin kürzlich zu einer neueren Version des Anwendungsservers gewechselt und diese Anfragen werfen 500 Serverfehler auf. Es wirft den Fehler auf, weil der Inhalt eines zweiten Formularparameters nicht richtig urlen codiert ist, aber ich brauche diesen Parameter sowieso nicht. (Ich kontaktierte den Verkäufer, um das Problem zu beheben, aber sie zwingen mich zu zahlen, um ihren Fehler zu beheben, so dass ich versuche, es selbst zu beheben, wenn möglich.)
Wie würde ich einen Servlet-Filter verwenden, um alle außer dem form-Parameter zu entfernen, der benannt wird: XMLContent Ich habe verschiedene Versuche versucht, den beleidigenden Parameter "TContent" explizit zu entfernen, aber es wird nie entfernt.
Ein Ausschnitt der empfangenen Daten:
%Vor%Der Code, den ich ausprobiert habe:
%Vor%Wir begegnen diesen Situationen jeden Tag bei der Handhabung des Gebiets. Wenn das Gebietsschema des Benutzers nicht dem Gebietsschema des Browsers entspricht, müssen wir die Anfrage aktualisieren. Aber es ist nicht veränderlich.
Lösung: Erstellen Sie eine Request-Wrapper-Klasse. Kopieren Sie vorhandene Anfrageparameter (die gewünschten) in sie und übergeben Sie diese Wrapper-Klasse in filterchain.doFilter ()
Beispiel Wrapper-Klasse:
%Vor%Machen Sie jetzt in Ihrem Filtercode Folgendes.
%Vor%Hoffentlich wird es Ihr Problem lösen.
Ansatz
Der Code folgt dem richtigen Ansatz:
in wrapRequest()
, instanziiert HttpServletRequestWrapper
und überschreibt die 4 Methoden, die das Parsen der Anfrage auslösen:
public String getParameter(String name)
public Map<String, String[]> getParameterMap()
public Enumeration<String> getParameterNames()
public String[] getParameterValues(String name)
Die Methode doFilter()
ruft die Filterkette mit der umbrochenen Anfrage auf, was bedeutet, dass nachfolgende Filter und das Ziel-Servlet (URL-gemappt) die umschlossene Anfrage erhalten.
Problem
Request.parseRequestParameters or parsePameters
). Diese 4 Methoden sind die einzige Möglichkeit, ein solches Parsing auszulösen. Bevor die Anforderung in parseRequest()
eingebunden wird, ruft Ihr Code solche Methoden für die zugrunde liegende Anforderung auf:
Lösung
Sie müssen die Analyselogik steuern. Das Lesen roher Bytes aus dem Eingabestream und das Ausführen einer eigenen URL-Dekodierung ist zu komplex - das würde bedeuten, dass eine große Menge eng gekoppelten Servercodes ersetzt wird. Stattdessen besteht der einfachste Ansatz darin, nur die Methode zu ersetzen, die die eigentliche URL-Decodierung durchführt. Das bedeutet, dass Sie die im vorherigen Abschnitt erwähnten Aufrufe request.getParameterXXX
an Ort und Stelle lassen können.
Nicht sicher, auf welchem Server Sie ColdFusion hosten, aber die folgende Beschreibung basiert auf Glassfish / Tomcat, kann aber angepasst werden. Am Ende dieses Posts befindet sich die interne Anfrage-Analysemethode von Glassfish (eine modifizierte Version von Tomcat). JD-decompiler ist nützlich für dieses Basteln, um .class-Dateien in .java umzuwandeln.
com.sun.grizzly.util.http.Parameters
von grizzly-utils.jar
wie unten gezeigt, für Tomcat ist dies org.apache.tomcat.util.http.Parameters
von tomcat-coyote.jar
) somepackage.StrippedParameters
value = urlDecode(this.tmpValue)
) Ändern Sie diesen Code so, dass er nur decodiert, wenn der Parametername mit dem gewünschten Parameter übereinstimmt:
%Vor% Nun der knifflige Teil: Ersetzen Sie die Standardklasse Parameters
durch Ihre Klasse StrippedParmeters
kurz vor der URL-Dekodierung. Sobald die Parameter abgerufen wurden, kopieren Sie sie zurück in die Containerklasse. Für Glassfish kopieren Sie die Methode parseRequestParameters in Ihre Implementierung von HttpServletRequestWrapper (für Tomcat ist die entsprechende Methode parseParameters
in Klasse org.apache.catalina.connector.Request
in catalina.jar
)
ersetzen Sie diese Zeile:
%Vor%mit:
%Vor%Fügen Sie am Ende der Methode Folgendes hinzu:
%Vor%Glassfish Container Code - Modifizierte Version von Tomcat, wobei Grizzly Coyote ersetzt (Catalina Servlet Engine bezieht sich immer noch auf Coyote-Objekte, aber es sind Grizzly-Instanzen, die wie Coyote verspottet werden)
%Vor% %Vor% %Vor%}
Tags und Links java servlets servlet-filters