Anforderungsparameter Verlust des Pluszeichens

Lesezeit: 3 Minuten

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.

Benutzeravatar von rid
loswerden

+ bedeutet “Leerzeichen” in URLs. Ersetzen Sie es durch %2B. Sie könnten dies direkt nach dem Komponieren tun descriptionsUrlAdditionzum Beispiel.

descriptionsUrlAddition = descriptionsUrlAddition.replace("+", "%2B");

  • Wie würdest du das aber umsetzen?

    – Snowy Coder Girl

    20. Oktober 2011 um 21:38 Uhr

  • @ Rachel G., einfach alle ersetzen + Zeichen mit %2B in der URL-Zeichenfolge. Sobald Ihre URL zusammengesetzt ist und Sie sie als Zeichenfolge haben, können Sie sie einfach verwenden String‘s replace() Methode. Beispiel hinzugefügt.

    – loswerden

    20. Oktober 2011 um 21:38 Uhr


  • Fügen Sie den Code hinzu (escape(descriptionSelectBox.options[i].value).replace(“+”, “%2B”)) zu Ihrer Antwort und ich markiere sie als richtig. Danke =)

    – Snowy Coder Girl

    20. Oktober 2011 um 21:42 Uhr

  • @ Rachel G., noch besser, ersetze es in der gesamten Zeichenfolge. Es wäre effizienter, da Sie nur anrufen replace() einmal.

    – loswerden

    20. Oktober 2011 um 21:43 Uhr

  • funktioniert bei mir nicht, ich habe eine URL mit + Zeichen ersetzt, die sie zu %2B ersetzt, aber keinen Nutzen.

    – malhobayyeb

    31. Oktober 2014 um 7:22 Uhr

Benutzeravatar von Henry Zhang
Heinrich Zhang

Für Javascript sollten Sie verwenden encodeURIComponent() oder encodeuri(). Zum Beispiel:

var uri = "fj74cvg+fd1==ee";
var res = encodeURIComponent(uri);

und res würde kodiert werden "fj74cvg%2Bfd1%3D%3Dee"

Für PHP können Sie verwenden URL-Code (). Zum Beispiel:

<?php
echo '<a href="https://stackoverflow.com/questions/7842547/mycgi?foo=", urlencode($userinput), '">';
?>

Diese Funktionen ersetzen alle Sonderzeichen in der Zeichenfolge, die als Teil der URL verwendet werden soll.

  • encodeURI() ändert sich nicht + zu %2B. Nur encodeURIComponent() tut.

    – jMahnung

    22. Dezember 2020 um 21:41 Uhr

Sie sollten auf der Vorderseite die Javascript-Funktion encodeuri verwenden, um Ihre Parameter zu codieren.

1429970cookie-checkAnforderungsparameter Verlust des Pluszeichens

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy