2011-02-19 21 views
32

¿Cuál es la mejor manera de codificar URL una cadena que representa la ruta URL (no el parámetro de solicitud) con JSTL?Cómo codificar una cadena que representa la ruta URL con JSTL?

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

Según any documentation I find, esto debe cuidar de él. Pero no es así Codifica maravillosamente los parámetros (<c:url value="/user/${user.name}"><c:param name="section" value="employment 4u so good"/></c:url>) pero no estoy pasando ningún parámetro. ¿Cómo puedo codificar con seguridad una URL simple, como la anterior, sin temor a lo que podría ser ${user.name}?

Respuesta

51

El <c:url> no codifica el URI como se especifica en su valor, sino solo los parámetros de solicitud de URL especificados por un <c:param> anidado. El artículo de IBM que vinculó tampoco dice lo contrario. Creo que lo confundiste con "reescritura de URL" (que en esencia no es más que anexar el jsessionid siempre que sea necesario).

Para lograr su requisito, lo mejor es crear una función EL personalizada que delegue en URLEncoder#encode() y modifique las reglas de URI de conformidad de resultados.

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

con

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

En la segunda parte de this answer se puede encontrar un ejemplo básico patada de cómo declarar y registrar funciones personalizadas EL.

+1

Gracias, Balus C. Esto es lo que estoy haciendo actualmente. Esperaba que hubiera algo incorporado, pero si esta es la mejor manera, que así sea. –

+16

Curiosamente URLEncoder.encode() en realidad no es la forma correcta de codificar una URL. Es la forma correcta de codificar un parámetro URL *. * Cambia espacios a + por ejemplo. La técnica correcta es el nuevo URI (null, url, null) .toASCIIString(), que por ejemplo cambia los espacios a% 20. – EJP

+1

La pregunta en su enlace final parece haber sido eliminada y solo es visible para 10k + usuarios. –

5

Estoy seguro de que ya sabías que esta era una solución alternativa, pero decidí, para mi uso particular, que la solución más elegante era usar un atributo de solicitud.

Así que en mi servlet:

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

y en mi JSP:

"...${myUrl}" 
+0

Esto es incorrecto. Ver [comentario de EJP] (http://stackoverflow.com/questions/5053975/how-to-url-encode-a-string-with-jstl#comment8244110_5064758). –

1

se podía utilizar la cadena TagLib Jakarta, que tiene una etiqueta encodeURL: http://jakarta.apache.org/taglibs/doc/string-doc/string-1.1.0/index.html#encodeUrl

Seguimiento estos pasos para configurar su aplicación web con esta biblioteca de etiquetas:

  1. Copie el archivo descriptor de la biblioteca de etiquetas en el subdirectorio/WEB-INF de su aplicación web.
  2. Copie el archivo JAR de la biblioteca de etiquetas en el subdirectorio/WEB-INF/lib de su aplicación web.
  3. Añadir un elemento a tu web descriptor de despliegue de aplicación en /WEB-INF/web.xml como se dice en el enlace anterior

Para utilizar las etiquetas de esta biblioteca en sus páginas JSP, agregue la siguiente directiva en la parte superior de cada página:

a continuación es el ejemplo de uso de JSP:

<a href="str:decodeUrl>${URL}</str:decodeUrl)"/> 
+11

Hay una gran caja de advertencia roja encima de todas las páginas de taglib de Yakarta que dice * "2010-04-14 - Jakarta Taglibs ha sido retirado." * Esto no es solo para la decoración. No deberías usarlo más. – BalusC

0

Debe ser sencillo de esta manera:

<%= java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %> 
+1

Bueno, esto es mantenerlo fácil, no simple. –

+0

Para mí, copiar y pegar en el lugar que lo necesito, es simple. Fácil podría ser usar menos caracteres. –

+0

Esto es incorrecto. Ver [comentario de EJP] (http://stackoverflow.com/questions/5053975/how-to-url-encode-a-string-with-jstl#comment8244110_5064758). –

Cuestiones relacionadas