2012-02-08 17 views
6

Ho un insieme complicato di funzioni annidate che essenzialmente disinfettano i dati.Come concatenare e disinfettare le stringhe in JSTL/EL?

Facciamo finta di voler emettere una combinazione nome-cognome che è stata disinfettata, ma i nomi sono presentati come due variabili separate.

Mi rendo conto che potrei semplicemente emettere ogni variabile separatamente, avvolgendole ciascuna nell'intero set di funzioni di disinfezione, ma questo è allo stesso tempo inelegante e pericoloso: grossi pezzi di codice duplicato, difficile da leggere, che devono essere mantenuti in sincronia nel corso della vita dell'app.

In un linguaggio vero e proprio, vorrei scrivere qualcosa di simile:

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

(Qui, il plus rappresenta un vero-blu operatore di concatenazione, di javascript '+', PHP di, ecc '')

Sembra anche assurdo usare una dichiarazione separata per concatenare semplicemente le variabili in anticipo.

Bottom line: questa domanda è stata posta migliaia di volte su Internet, ma tutte le risposte evitano efficacemente la domanda proponendo un'implementazione alternativa. Voglio sapere se questa funzione esiste e la documentazione è peggio che banale.

Per favore, concludi la mia sofferenza e dammi una risposta diretta.

+5

Questo non è il lavoro di un JSP. Fallo in Java, in una servlet o azione del tuo framework MVC preferito e mostra solo il risultato preparato e igienizzato nel JSP. –

risposta

22

Che cosa si desidera disinfettare esattamente? Caratteri speciali HTML/XML come <, > e così via per evitare buchi XSS? Se è così, perché non usare semplicemente <c:out>?

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

Se c'è davvero più nella foto, più pulito sarebbe quello di refactoring quel lavoro in un metodo public static utility, registrarlo come una funzione di EL ed 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; 
    } 

} 

che è registrato come segue in un file di /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> 

ed è utilizzato come segue

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

Non ho seguito questa soluzione nel caso in cui abbia richiesto la mia domanda, ma apprezzo molto i dettagli sull'approccio. Probabilmente lo userò in futuro. :) – Tom

Problemi correlati