В этом контексте допускаются только переменные выражения, возвращающие числа или логические значения. - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь передать значение в мою функцию javascript, но этот вызов функции зависит от логической переменной.У меня это работало нормально, пока я недавно не обновил систему безопасности до тимилефа 5.

Это фрагмент кода.

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

timerEnabled должен быть истинным, чтобы вызов функции был выполнен, но теперь - тимилефвыдает исключение как

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. 

Как я могу решить эту проблему?Спасибо.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Попробуйте это так.

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

Если это не сработает, вы также можете попробовать использовать 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>

Я знаю, другая версия выглядитнамного лучше, но так как он не работает, этот не так уж и плох.Конечно, я бы не рекомендовал добавлять его к вашему вину в этом случае.

Что я нахожу странным, так это то, что я пробую твой код, он работает на моем конце.Кто знает, почему вы получаете эту ошибку.

0 голосов
/ 31 октября 2018

Начиная с Thymeleaf 3.0.10, они исправили ошибку безопасности в отношении неэкранированного кода.

Попробуйте

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

Или рекомендуемый способ:

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

Читатьбольше: https://github.com/thymeleaf/thymeleaf/issues/707 И: http://forum.thymeleaf.org/Thymeleaf-3-0-10-JUST-PUBLISHED-tt4031348.html#a4031353

0 голосов
/ 23 октября 2018

Я смог заставить его работать, используя этот подход

<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>

Любой другой подход, такой как предложенный в исключении, приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...