webentwicklung-frage-antwort-db.com.de

Wie codiere ich einen String, der den URL-Pfad darstellt, mit JSTL?

Wie kann ein String, der den URL-Pfad (nicht den Anforderungsparameter) darstellt, mit JSTL am besten per URL codiert werden?

<c:url value="/user/${user.name}"/>

Laut jegliche Dokumentation, die ich finde sollte sich das darum kümmern. Aber das tut es nicht. Es verschlüsselt Parameter wunderschön (<c:url value="/user/${user.name}"><c:param name="section" value="employment 4u so good"/></c:url>) aber ich übergebe keine parameter. Wie kann ich eine einfache URL wie oben sicher codieren, ohne befürchten zu müssen, was ${user.name} könnte sein?

32
Josh Johnson

Das <c:url> Codiert nicht den URI wie in seinem Wert angegeben, sondern nur URL-Anforderungsparameter, die durch ein verschachteltes <c:param> Angegeben werden. Der IBM Artikel, den Sie verlinkt haben, sagt auch nichts anderes. Ich denke, dass Sie es mit "URL-Neuschreiben" verwechselt haben (was im Wesentlichen nichts anderes ist, als die jsessionid anzufügen, wann immer dies erforderlich ist).

Um Ihre Anforderung zu erfüllen, erstellen Sie am besten eine benutzerdefinierte EL-Funktion, die an URLEncoder#encode() delegiert und die ergebniskonformen URI-Regeln ändert.

<a href="/user/${util:encodeURI(user.name)}">view profile</a>

mit

public static String encodeURI(String value) throws UnsupportedEncodingException {
    return URLEncoder.encode(value, "UTF-8")
        .replace("+", "%20")
        .replace("%21", "!")
        .replace("%27", "'")
        .replace("%28", "(")
        .replace("%29", ")")
        .replace("%7E", "~");
}

Im zweiten Teil von diese Antwort finden Sie ein grundlegendes Kickoff-Beispiel zum Deklarieren und Registrieren benutzerdefinierter EL-Funktionen.

53
BalusC

Ich bin sicher, Sie wussten bereits, dass dies eine alternative Lösung ist, aber ich entschied, dass die eleganteste Lösung für meine spezielle Verwendung die Verwendung eines Anforderungsattributs ist.

Also in meinem Servlet:

req.setAttribute("myUrl", URLEncoder.encode(myUrl, "UTF-8"));

und in meiner JSP:

"...${myUrl}"
5
J. Dimeo

sie können den Jakarta-String TagLib verwenden, der ein encodeUrl-Tag hat: http://jakarta.Apache.org/taglibs/doc/string-doc/string-1.1.0/index.html#encodeUrl

Führen Sie die folgenden Schritte aus, um Ihre Webanwendung mit dieser Tag-Bibliothek zu konfigurieren:

  1. Kopieren Sie die Deskriptordatei der Tag-Bibliothek in das Unterverzeichnis/WEB-INF Ihrer Webanwendung.
  2. Kopieren Sie die JAR-Datei der Tag-Bibliothek in das Unterverzeichnis/WEB-INF/lib Ihrer Webanwendung.
  3. Fügen Sie Ihrem Webanwendungs-Deployment-Deskriptor in /WEB-INF/web.xml ein Element hinzu, wie im obigen Link angegeben

Um die Tags aus dieser Bibliothek in Ihren JSP-Seiten zu verwenden, fügen Sie oben auf jeder Seite die folgende Anweisung hinzu:

unten ist das Beispiel für die Verwendung in jsp:

<a href="str:decodeUrl>${URL}</str:decodeUrl)"/>
1
shivaganesh

Halte es so einfach:

<%= Java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %>
1
Daniel De León

Die richtige Technik ist new URI(null, url, null).toASCIIString(), wodurch beispielsweise Leerzeichen in %20 Geändert werden.

Dies könnte hilfreich sein:

Wie codiere ich einen String, der den URL-Pfad darstellt, mit JSTL?

0
AlexN