Verwenden Sie den Servlet-Filter, um einen Formularparameter aus den gebuchten Daten zu entfernen

8

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%     
Matt 11.07.2013, 18:59
quelle

2 Antworten

6

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.

    
ajgautam 19.07.2013 10:08
quelle
5

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

  • Der Aufruf einer der vier Methoden getParameterXXX () der zugrunde liegenden 'ursprünglichen Anfrage' löst das implizite Parsen von allen Anfrageparametern aus (über eine interne Servermethode wie 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:

    %Vor%

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.

  1. Finden Sie die Klasse, die die URL-Dekodierung durchführt (für Glassfish ist dies 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 )
  2. Kopieren Sie den gesamten Quellcode in eine neue Klasse somepackage.StrippedParameters
  3. Suchen Sie die Codezeile, die den Parameterwert dekodiert (unten: value = urlDecode(this.tmpValue) )
  4. Ändern Sie diesen Code so, dass er nur decodiert, wenn der Parametername mit dem gewünschten Parameter übereinstimmt:

    %Vor%
  5. 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%

}

    
Glen Best 23.07.2013 07:40
quelle

Tags und Links