web-dev-qa-db-fra.com

Seules les expressions variables renvoyant des nombres ou des booléens sont autorisées dans ce contexte.

J'essaie de passer une valeur à ma fonction javascript mais cet appel de fonction dépend d'une variable booléenne. Je fonctionnais très bien jusqu’à ce que je passe récemment à la sécurité 5 de Thymeleaf.

Ceci est l'extrait de code.

<body th:onload="${timerEnabled} ? 'javascript:runTimer(\'' + ${timeRemaining} + '\');'">

timerEnabled doit être vrai pour que la fonction soit exécutée, mais thymeleaf lève maintenant une exception

org.thymeleaf.exceptions.TemplateProcessingException: Only variable expressions returning numbers or booleans are allowed in this context, any other datatypes are not trusted in the context of this expression, including Strings or any other object that could be rendered as a text literal. A typical case is HTML attributes for event handlers (e.g. "onload"), in which textual data from variables should better be output to "data-*" attributes and then read from the event handler. 

Comment puis-je résoudre ça? Je vous remercie.

4
Knight Rider

J'ai pu le faire fonctionner en utilisant cette approche

<body>

<script th:inline="javascript">
    /*<![CDATA[*/

    var flag = [[${timerEnabled}]]; // if timer should be included or not
    var timeRemaining = [[${timeRemaining}]]; // the time remaining.
    window.onload = function() {
        if(!flag)
            return; // Exit/Return if the variable is false
        runTimer(timeRemaining); // Call your favourite method if the variable is true
    };

    /*]]>*/
</script>

Toute autre approche telle que suggérée dans l'exception est appréciée.

0
Knight Rider

Depuis Thymeleaf 3.0.10, ils ont corrigé un bogue de sécurité concernant le code non échappé.

Essayer 

<body th:onload="[[${timerEnabled}]] ? 'javascript:runTimer(\'' + 
[[${timeRemaining}]] + '\');'">

Ou la manière recommandée:

<body th:data1="${timerEnabled}"
  th:data2="${timeRemaining}"
    th:onload="this.getAttribute('data1') ? javascript:runTimer(this.getAttribute('data2'));">

Pour en savoir plus: https://github.com/thymeleaf/thymeleaf/issues/707 Et: http://forum.thymeleaf.org/Thymeleaf-3-0-10 -JUST-PUBLISHED-tt4031348.html # a4031353

5
leome

Essayez de cette façon.

<body th:onload="${timerEnabled eq true} ? 'javascript:runTimer(\'' + ${timeRemaining} + '\');'">

Si cela ne fonctionne pas, vous pouvez également essayer d'utiliser th:if.

<th:block th:if="${timerEnabled} eq true">
    <body th:onload="javascript:runTimer(\'' + ${timeRemaining} + '\');'">
    </body>
</th:block>
<th:block th:if="${timerEnabled} eq false">
    <body></body>
</th:block>

Je sais que l’autre version semble beaucoup mieux, mais comme elle ne fonctionne pas, celle-ci n’est pas si mauvaise. Bien sûr, je ne recommanderais pas de l'ajouter à votre gage dans ce cas. 

Ce que je trouve bizarre, c’est que j’essaie votre code, ça marche de mon côté. Qui sait pourquoi vous obtenez cette erreur.

0
Alain Cruz