2012-02-08 8 views
6

Tengo un complicado conjunto de funciones anidadas que esencialmente desinfectan los datos.¿Cómo concateno y saneo las cadenas en JSTL/EL?

Supongamos que queremos emitir una combinación firstname-lastname que ha sido desinfectada, pero los nombres se presentan como dos variables separadas.

Me doy cuenta de que podría simplemente emitir cada variable por separado, envolviendo cada una en el conjunto completo de funciones desinfectantes, pero eso es poco elegante y peligroso: grandes trozos de código difícil de leer y duplicado que deben mantenerse sincronizados durante la vida útil de la aplicación.

En un lenguaje real, me gustaría escribir algo como esto:

${fn:trim(fn:replace(fn:replace(fn:replace(fn:replace(firstname + lastname, ..., ...), ..., ...), ..., ...), ..., ...))} 

(Aquí, el signo más representa un operador de cierto-azul concatenación; javascript de '+', PHP, etc. '')

También parece un poco absurdo usar una declaración separada para simplemente concatenar las variables de antemano.

Conclusión: esta pregunta se ha formulado mil veces en Internet, pero todas las respuestas evadieron la cuestión al proponer una implementación alternativa. Quiero saber si esta característica existe, y la documentación es peor que trivial.

Por favor, finaliza mi sufrimiento y dame una respuesta directa.

+5

Este no es el trabajo de un JSP. Hágalo en Java, en un servlet o acción de su marco MVC preferido, y solo muestre el resultado preparado y desinfectado en el JSP. –

Respuesta

22

¿Qué es exactamente lo que quiere desinfectar? Caracteres especiales HTML/XML como <, > y así sucesivamente para evitar agujeros XSS? Si es así, ¿por qué no simplemente usar <c:out>?

<c:out value="${firstname} ${lastname}" /> 

Si no hay realmente más en cada fotografía, más limpio sería refactorizar ese trabajo en un método public static utilidad, registrarlo como una función de EL y invocarlo.

E.g.

public final class Functions { 

    private Functions() { 
     // Hide c'tor in utility classes. 
    } 

    public static String sanitizeNames(String firstname, String lastname) { 
     // TODO: Implement. 

     return sanitizedFirstname + sanitizedLastname; 
    } 

} 

que se coloca como la siguiente en un archivo /WEB-INF/functions.tld

<?xml version="1.0" encoding="UTF-8" ?> 
<taglib 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" 
    version="2.1"> 

    <display-name>Custom Functions</display-name>  
    <tlib-version>1.0</tlib-version> 
    <uri>http://example.com/functions</uri> 

    <function> 
     <name>sanitizeNames</name> 
     <function-class>com.example.Functions</function-class> 
     <function-signature>java.lang.String sanitizeNames(java.lang.String, java.lang.String)</function-signature> 
    </function> 
</taglib> 

y se utiliza de la siguiente manera

<%@taglib uri="http://example.com/functions" prefix="f" %> 
... 
${f:sanitizeNames(firstname, lastname)} 
+0

No busqué esta solución en el caso en que surgió mi pregunta, pero aprecio mucho sus detalles sobre el enfoque. Probablemente lo use en el futuro. :) – Tom

Cuestiones relacionadas