web-dev-qa-db-ja.com

このコンテキストでは、数値またはブール値を返す変数式のみが許可されます

Javascript関数に値を渡そうとしていますが、その関数呼び出しはブール変数に依存しています。最近thymeleafセキュリティ5にアップグレードするまで、これは正常に機能していました。

これはコードスニペットです。

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

関数呼び出しを行うにはtimerEnabledをtrueにする必要がありますが、thymeleafは次のように例外をスローします。

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. 

どうすれば解決できますか?ありがとうございました。

10
Knight Rider

私はこのアプローチを使用してそれを動作させることができました

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

例外で提案されているような他のアプローチは歓迎されます。

1
Knight Rider

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

16
leome

この方法で試してください。

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