2016-03-25 22 views
2

Ich habe einen Tomcat-Server mit Java-Servlets. Ich versuche ein Servlet zu erstellen, das gespeicherte Dateien aufgrund ihrer verschlüsselten IDs zurückgibt.Warum gibt diese URL den Fehler 400 von Tomcat zurück?

ID: 100

Encrypted ID: + e4/E5cR/aM =

URL-codierte ID:% 2BE4% 2FE5cR% 2FaM% 3D

Resultierende URL: http://localhost/file/demo/%2Be4%2FE5cR%2FaM%3D

Wenn ich versuche, diesem Link zu folgen, komme ich nicht einmal in den Code meines Servlets - der Server gibt diesen Fehler zurück: Ressource konnte nicht geladen werden: Der Server reagierte mit dem Status 400 (Ungültige Anforderung)

Was ist falsch an dieser URL, die Tomcat dazu veranlasst hat, sie abzulehnen, bevor sie meinen Code erreicht? Ich habe es über einen URL-Encoder ausgeführt, und ich sehe keine ungültigen Zeichen darin.

+0

Die URL kann korrekt sein, es hängt davon ab, wie Sie Tomcat und die Web App konfiguriert haben. Ist diese URL wirklich dem Servlet zugeordnet? – Henry

Antwort

5

Sie haben Schrägstrich "/"in der URL codiert. Apache erlaubt sie wegen potenzieller Angriffe nicht. Es setzt ihnen erlauben:

System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true"); 

oder

-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true 

Siehe ähnliche post.

+0

Für alle Interessierten entschied ich mich, die verschlüsselte ID zu entfernen und sie durch ein zufällig generiertes Token zu ersetzen, das in der DB gespeichert wurde. Danke für den Tipp. –

+0

Hallo, bitte, wo kann ich diese Parameter ändern? DANK – JohnnySparow

+0

Wenn Sie Ihre JVM starten, können Sie -D bereitstellen, siehe die Antwort -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = true, oder Sie können die Eigenschaft im Code festlegen. Antwort Art hat es –

0

Sie sind wahrscheinlich eines von 2 Probleme auftreten:

1) Sie haben nicht den Port in der URL enthalten. Entweder haben Sie den Tomcat-Port zu Port 80 konfiguriert, wobei in diesem Fall der Anschluss nicht benötigt wird, oder Sie müssen den Port schließen, die standardmäßig auf 8080, zum Beispiel:

http://localhost:8080/file/demo/%2Be4%2FE5cR%2FaM%3D 

2) Sie fügen den verschlüsselten ID als Teil der URL selbst, die in Ihren URL-Mappings einem Servlet/JSP/View irgendeiner Art zugeordnet werden müsste und nicht wahrscheinlich ist. Tomcat erkennt eine eindeutige ID nicht und weiß, dass ein entsprechender Handler aufgerufen wird, um das Mapping zu verarbeiten. Angenommen, Sie wollen die Servlet aufrufen/JSP/Controller, der zu ‚/ file/Demo‘ abgebildet wird, würden Sie mehr wollen wahrscheinlich die ID als Anforderung Parameter zu übergeben, zum Beispiel:

http://localhost:8080/file/demo?id=%2Be4%2FE5cR%2FaM%3D 
Verwandte Themen