webentwicklung-frage-antwort-db.com.de

Thymeleaf + Spring: Wie hält man den Zeilenumbruch?

Ich verwende die Thymeleaf-Vorlagen-Engine mit Spring und möchte Text anzeigen, der in einem mehrzeiligen Textbereich gespeichert ist.

In meiner Datenbank werden mehrzeilige Zeichenfolgen mit "\ n" wie folgt gespeichert: "Test1\nTest2\n ...."

Mit th: text habe ich: "Test1 Test2" ohne Zeilenumbruch.

Wie kann ich Zeilenumbrüche mit Thymeleaf anzeigen und manuell "\ n" durch <br /> ersetzen und dann th: utext (dieses offene Formular für die xss-Injektion) vermeiden?

Vielen Dank !

18
Daividh

Zwei Ihrer Möglichkeiten: 

  1. Verwenden Sie th: utext - einfache Setup-Option, aber schwieriger zu lesen und zu merken
  2. Erstellen Sie einen benutzerdefinierten Prozessor und einen benutzerdefinierten Dialekt - eine aufwendigere Einrichtung, aber eine leichtere und lesbarere zukünftige Verwendung.

Option 1:

Sie können th: utext verwenden, wenn Sie den Text mit der Ausdruckswerkzeugmethode #strings.escapeXml( text ) umleiten, um XSS-Injektion und unerwünschte Formatierungen zu verhindern. - http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#strings

Um diese Plattform unabhängig zu machen, können Sie T(Java.lang.System).getProperty('line.separator') verwenden, um den Linientrenner zu erfassen. 

Dies funktioniert mit den vorhandenen Thymeleaf-Ausdrucks-Dienstprogrammen:

<p th:utext="${#strings.replace( #strings.escapeXml( text ),T(Java.lang.System).getProperty('line.separator'),'&lt;br /&gt;')}" ></p>

Option 2:

Die API dafür unterscheidet sich jetzt in 3 (Ich habe dieses Tutorial für 2.1 geschrieben) Hoffentlich können Sie die unten stehende Logik mit ihrem offiziellen Tutorial kombinieren. Eines Tages werde ich vielleicht eine Minute Zeit haben, um dies vollständig zu aktualisieren. Aber jetzt: Hier ist das offizielle Thymeleaf-Tutorial zum Erstellen eines eigenen Dialekts.

Wenn das Setup abgeschlossen ist, müssen Sie alles tun, um die Ausgabe der Escape-Textzeile mit beibehaltenen Zeilenumbrüchen zu erreichen:

<p fd:lstext="${ text }"></p>

Der Hauptteil der Arbeit ist der Prozessor. Der folgende Code wird den Trick ausführen:

package com.foo.bar.thymeleaf.processors 

import Java.util.Collections;
import Java.util.List;

import org.thymeleaf.Arguments;
import org.thymeleaf.Configuration;
import org.thymeleaf.dom.Element;
import org.thymeleaf.dom.Node;
import org.thymeleaf.dom.Text;
import org.thymeleaf.processor.attr.AbstractChildrenModifierAttrProcessor;
import org.thymeleaf.standard.expression.IStandardExpression;
import org.thymeleaf.standard.expression.IStandardExpressionParser;
import org.thymeleaf.standard.expression.StandardExpressions;
import org.unbescape.html.HtmlEscape;

public class HtmlEscapedWithLineSeparatorsProcessor extends
        AbstractChildrenModifierAttrProcessor{

    public HtmlEscapedWithLineSeparatorsProcessor(){
        //only executes this processor for the attribute 'lstext'
        super("lstext");
    }

    protected String getText( final Arguments arguments, final Element element,
            final String attributeName) {

        final Configuration configuration = arguments.getConfiguration();

        final IStandardExpressionParser parser =
            StandardExpressions.getExpressionParser(configuration);

        final String attributeValue = element.getAttributeValue(attributeName);

        final IStandardExpression expression =
            parser.parseExpression(configuration, arguments, attributeValue);

        final String value = (String) expression.execute(configuration, arguments);

        //return the escaped text with the line separator replaced with <br />
        return HtmlEscape.escapeHtml4Xml( value ).replace( System.getProperty("line.separator"), "<br />" );


    }



    @Override
    protected final List<Node> getModifiedChildren(
            final Arguments arguments, final Element element, final String attributeName) {

        final String text = getText(arguments, element, attributeName);
        //Create new text node signifying that content is already escaped.
        final Text newNode = new Text(text == null? "" : text, null, null, true);
        // Setting this allows avoiding text inliners processing already generated text,
        // which in turn avoids code injection.
        newNode.setProcessable( false );

        return Collections.singletonList((Node)newNode);


    }

    @Override
    public int getPrecedence() {
        // A value of 10000 is higher than any attribute in the SpringStandard dialect. So this attribute will execute after all other attributes from that dialect, if in the same tag.
        return 11400;
    }


}

Jetzt, da Sie den Prozessor haben, benötigen Sie einen benutzerdefinierten Dialekt, um den Prozessor hinzuzufügen.

package com.foo.bar.thymeleaf.dialects;

import Java.util.HashSet;
import Java.util.Set;

import org.thymeleaf.dialect.AbstractDialect;
import org.thymeleaf.processor.IProcessor;

import com.foo.bar.thymeleaf.processors.HtmlEscapedWithLineSeparatorsProcessor;

public class FooDialect extends AbstractDialect{

    public FooDialect(){
        super();
    }

    //This is what all the dialect's attributes/tags will start with. So like.. fd:lstext="Hi David!<br />This is so much easier..."
    public String getPrefix(){
        return "fd";
    }

    //The processors.
    @Override
    public Set<IProcessor> getProcessors(){
        final Set<IProcessor> processors = new HashSet<IProcessor>();
        processors.add( new HtmlEscapedWithLineSeparatorsProcessor() );
        return processors;
    }

}

Jetzt müssen Sie es Ihrer XML- oder Java-Konfiguration hinzufügen:

Wenn Sie eine Spring MVC-Anwendung schreiben, müssen Sie sie nur in der additionalDialects -Eigenschaft der Template Engine-Bean festlegen, sodass sie dem Standard-SpringStandard-Dialekt hinzugefügt wird:

    <bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
  <property name="templateResolver" ref="templateResolver" />
  <property name="additionalDialects">
    <set>
      <bean class="com.foo.bar.thymeleaf.dialects.FooDialect"/>
    </set>
  </property>
    </bean>

Wenn Sie Spring verwenden und JavaConfig lieber verwenden möchten, können Sie in Ihrem Basispaket eine mit @Configuration annotierte Klasse erstellen, die den Dialekt als verwaltete Bean enthält:

package com.foo.bar;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.foo.bar.thymeleaf.dialects.FooDialect;

@Configuration
public class TemplatingConfig {

    @Bean
    public FooDialect fooDialect(){
        return new FooDialect();
    }
}

Weitere Referenzen zum Erstellen von benutzerdefinierten Prozessoren und Dialekten: http://www.thymeleaf.org/doc/articles/sayhelloextendingthymeleaf5minutes.html , http://www.thymeleaf.org/doc/articles/ sayhelloagainextendingthymeleafevenmore5minutes.html und http://www.thymeleaf.org/doc/tutorials/2.1/extendingthymeleaf.html

20
David Roberts

In meinem Fall gibt escapeJava() Unicode-Werte für kyrillische Symbole zurück, so dass ich die unescapeJava()-Methode einwickle, um mein Problem zu lösen.

<div class="text" th:utext="${#strings.unescapeJava(#strings.replace(#strings.escapeJava(comment.text),'\n','&lt;br /&gt;'))}"></div>
5

Vielleicht nicht das, was das OP im Sinn hatte, aber das funktioniert und verhindert die Code-Injektion:

<p data-th-utext="${#strings.replace(#strings.escapeXml(text),'&#10;','&lt;br&gt;')}"></p>

(Mit Thymeleaf im HTML5-Stil.)

5
holmis83

Versuche dies

<p th:utext="${#strings.replace(#strings.escapeJava(description),'\n','&lt;br /&gt;')}" ></p>

Wenn Sie jQuery in thymeleaf verwenden, können Sie Ihren Code folgendermaßen formatieren:

$('#idyourdiv').val().replace(/\n\r?/g, '<br />')

Hoffe diese Antwort kann dir helfen

0
HAJARI Youssef

Sie müssen th: utext verwenden und die Unterbrechungszeile an die Zeichenfolge ..__ anhängen. Mein Code lautet:

StringBuilder message = new StringBuilder();
        message.append("some text");
        message.append("<br>");
        message.append("some text");

<span th:utext="${message}"></span>
0