Ich bearbeite ein Suchformular und versuche, es vor Sonderzeichen in der Datenbank zu schützen. Im JSP-Suchformular ermöglicht ein Dropdown-Menü (Mehrfachauswahl) den Benutzern, Beschreibungen auszuwählen, die in der Abfrage verwendet werden (Hinweis: Beschreibungen sind eine Liste von Zeichenfolgen):
<select id="descriptionSelect" multiple="multiple">
<c:forEach items="${descriptions}" var="description">
<option value="${fn:escapeXml(description)}")}">
<c:out value="${description}" />
</option>
</c:forEach>
</select>
Wenn das Formular gesendet wird, generiert die Seite dynamisch die URL, die Abfrageparameter in der URL übernimmt (hässlich, ich weiß, die Hände sind gebunden). Hier ist das Snipet, das das Beschreibungssegment bildet.
var descriptionSelectBox = document.getElementById("descriptionSelect");
var descriptionsUrlAddition = "";
for (var i = 0; i < descriptionSelectBox.options.length; i++) {
if (descriptionSelectBox.options[i].selected) {
descriptionsUrlAddition += "&descriptions=" + escape(descriptionSelectBox.options[i].value);
}
}
Ich habe einen Testeintrag in der Datenbank, dessen Beschreibung lautet:
AAA `~!@#$%^&*()_+-={}|[]\:”;’<>?,./ Und wow, das hat viele Sonderzeichen.
Mit dem obigen Code verliert die Beschreibung aus irgendeinem Grund das +-Zeichen (es wird nur ein Leerzeichen), wenn die Anforderung beim Controller ankommt.
Weiß jemand, was passieren könnte und wie man es beheben kann? Ich bin mir nicht sicher, ob es etwas mit der speziellen Verwendung von + in URLs zu tun hat oder was. Ich könnte bearbeiten, wie die Beschreibungsliste gefüllt ist (vielleicht dort entkommen). Wenn Sie dies als Vorschlag anbieten, verwenden Sie bitte Java-spezifischen Code (keine Apache-Escape-Utils-Klassen usw.).
Wenn es hilft, weisen Sie mit Warnungen im JavaScript darauf hin, dass das +-Zeichen nicht umgewandelt wird, bevor die Anfrage gesendet wird.