web-dev-qa-db-fra.com

Comment encoder une chaîne représentant le chemin URL avec JSTL?

Quelle est la meilleure façon de coder une chaîne URL représentant le chemin URL (pas le paramètre de demande) avec JSTL?

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

Selon toute documentation que je trouve , cela devrait s'en occuper. Mais ce n'est pas le cas. Il code magnifiquement les paramètres (<c:url value="/user/${user.name}"><c:param name="section" value="employment 4u so good"/></c:url>) mais je ne passe aucun paramètre. Comment puis-je encoder une URL simple en toute sécurité, comme ci-dessus, sans avoir peur de ce que ${user.name} pourrait être?

32
Josh Johnson

<c:url> Ne code pas l'URI comme spécifié dans sa valeur, mais seulement les paramètres de demande d'URL qui sont spécifiés par un <c:param> Imbriqué. L'article IBM que vous avez lié ne dit pas non plus le contraire. Je pense que vous l'avez confondu avec "réécriture d'URL" (ce qui n'est rien de plus que d'ajouter le jsessionid chaque fois que nécessaire).

Pour répondre à vos besoins, le mieux est de créer une fonction EL personnalisée qui délègue à URLEncoder#encode() et modifie les règles URI conformes au résultat.

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

avec

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", "~");
}

Dans la 2ème partie de cette réponse vous pouvez trouver un exemple de démarrage de base pour déclarer et enregistrer des fonctions EL personnalisées.

53
BalusC

Je suis sûr que vous saviez déjà que c'était une solution alternative, mais j'ai décidé que pour mon usage particulier, la solution la plus élégante était d'utiliser un attribut de demande.

Donc dans ma servlet:

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

et dans mon JSP:

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

vous pouvez utiliser le jakarta String TagLib, qui a une balise encodeUrl: http://jakarta.Apache.org/taglibs/doc/string-doc/string-1.1.0/index.html#encodeUrl

Suivez ces étapes pour configurer votre application Web avec cette bibliothèque de balises:

  1. Copiez le fichier descripteur de bibliothèque de balises dans le sous-répertoire/WEB-INF de votre application Web.
  2. Copiez le fichier JAR de la bibliothèque de balises dans le sous-répertoire/WEB-INF/lib de votre application Web.
  3. Ajoutez un élément à votre descripteur de déploiement d'application Web dans /WEB-INF/web.xml comme indiqué dans le lien ci-dessus

Pour utiliser les balises de cette bibliothèque dans vos pages JSP, ajoutez la directive suivante en haut de chaque page:

ci-dessous est l'exemple d'utilisation dans jsp:

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

Restez simple de cette façon:

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

La technique correcte est new URI(null, url, null).toASCIIString(), qui change par exemple les espaces en %20

Cela pourrait être utile:

Comment encoder une chaîne représentant un chemin URL avec JSTL?

0
AlexN