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?
<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.
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}"
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:
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)"/>
Restez simple de cette façon:
<%= Java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %>
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?