2009-08-12 24 views
10

En las plantillas Freemarker podemos usar la directiva de escape para aplicar automáticamente un escape a todas las interpolaciones dentro del bloque incluye:defecto escapar en Freemarker

<#escape x as x?html> 
    <#-- name is escaped as html --> 
    Hallo, ${name} 
</#escape> 

¿Hay una manera de lograr la programación un efecto similar, la definición de un valor predeterminado escape aplicado a todas las interpolaciones en la plantilla, incluidas las directivas de escape externas?

Gracias.

Respuesta

2

Existe una solución, aunque no es del todo trivial. Puede crear un TemplateLoader especial que envuelve otros cargadores de plantillas e inyecta < #escape x como x? Html> en el prólogo del texto fuente de la plantilla, y lo agrega como epílogo.

inconvenientes obvios: - números de columna en primera línea serán arrojados fuera - si su plantilla comienza con < #ftl> declaración, es necesario insertar < #escape> después de ella.

5

Para más detalles sobre la respuesta de Attila: se puede usar una clase como this one y luego envolver su cargador de plantillas como esto:

final TemplateLoader templateLoader = new ClassTemplateLoader(this.getClass(), templatePath) { 
    /** 
    * Replaces the normal template reader with something that changes the default 
    * escaping to HTML as to avoid XSS attacks. 
    */ 
    @Override 
    public Reader getReader(Object templateSource, String encoding) throws IOException { 
    return new WrappingReader(super.getReader(templateSource, encoding), "<#escape x as x?html>", "</#escape>"); 
    } 
}; 

Si no se incluye saltos de línea en las partes añadidas no obtiene la problema de numeración de línea Sin embargo, no puedes usar el < #ftl>/[# ftl] con este enfoque.

+0

de Pedro a la clase WrappingReader ya no funciona. La nueva ubicación: http://sourceforge.net/p/metadata-net/code/HEAD/tree/shared/trunk/util/src/main/java/au/edu/uq/itee/maenad/util/WrappingReader. java –

+0

@StefanHaberl: Actualicé la respuesta, gracias. –

1

No necesita un WrappingReader para agregar los escapes. Puede simplemente crear un decorador alrededor de cualquier TemplateLoader, leer en la plantilla en una Cadena, envolver el texto de la plantilla en escapes y luego devolver un StringReader que lea la Cadena resultante. Para ver cómo se hace, echa un vistazo a here. Lo único que encontré es que si usas este enfoque e incluyes las macros spring.ftl del classpath explotarán, ya que tienen una declaración < #ftl> en la parte superior. Sin embargo, simplemente puede copiar spring.ftl en su ruta de plantilla y eliminar la declaración (y todas las directivas de escape, ya que escapará de forma predeterminada).

2

Los TemplateLoaders sugeridos en los enlaces necesitan un poco de ajuste si está usando < #include parse = false ... /> para incluir, por ejemplo, HTML en sus plantillas.

Además, debe copiar spring.ftl y usar su propia copia con la directiva < #ftl ..> en la parte superior, como dijo Tom.

Los siguientes funciona bien, aunque un poco duro (utilizando más de guayaba commons-io)

@Override 
public Reader getReader(Object pTemplateSource, String pEncoding) throws IOException { 
    Reader tReader = delegate.getReader(pTemplateSource, pEncoding); 
    try { 
     String tTemplateText = CharStreams.toString(tReader); 

     //only include files ending with "ftl", as we may have some parse=false on included html files 
     if (pTemplateSource.toString().endsWith("ftl")) { 
      return new StringReader(ESCAPE_PREFIX + tTemplateText + ESCAPE_SUFFIX); 
     } 
     return new StringReader(tTemplateText); 
    } finally { 
     Closeables.closeQuietly(tReader); 
    } 
} 
3

Desde 2.3.24 cada plantilla tiene una asociados freemarker.core.OutputFormat objeto, que especifica si y cómo ${...} (y #{...}) se escapó OuputFormat para HTML, XML y RTF se proporcionan de fábrica, pero también puede definir sus propios formatos. Cuando el OutputFormat seleccionado se escapa de forma predeterminada, puede evitar el escape explícitamente como ${foo?no_esc}.

Existen varias formas de asociar plantillas con el OutputFormat que desee. Para escapes de HTML y XML, la forma recomendada es establecer la configuración recognize_standard_file_extensions en true, luego usar la extensión de archivo ftlh para HTML y la extensión de archivo ftlx para plantillas XML.También puede asociar OutputFormat -s a plantillas basadas en patrones de nombre de plantilla arbitrarios (ruta de plantilla), utilizando la configuración template_configurers. Por último, puede configurar el formato de salida predeterminado globalmente como configuration.setOutputFormat(HTMLOutputFormat.INSTANCE). También puede anular el formato de salida en la parte superior de la plantilla como <#ftl output_format='HTML'>, aunque debe usarse con poca frecuencia.

páginas de documentación relacionados: http://freemarker.org/docs/dgui_misc_autoescaping.html, enlace http://freemarker.org/docs/pgui_config_outputformatsautoesc.html