在此上下文中仅允许返回数字或布尔值的变量表达式

Posted

技术标签:

【中文标题】在此上下文中仅允许返回数字或布尔值的变量表达式【英文标题】:Only variable expressions returning numbers or booleans are allowed in this context 【发布时间】:2019-03-26 17:51:58 【问题描述】:

我正在尝试将一个值传递给我的 javascript 函数,但该函数调用取决于一个布尔变量。在我最近升级到 thymeleaf security 5 之前,我一直运行良好。

这是代码 sn-p。

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

我该如何解决这个问题?谢谢。

【问题讨论】:

为什么用spring-boot标记? 因为这是一个 spring-boot 应用程序,我刚刚升级到 2.0.6。也许我不必标记它。认为它会有所贡献。 【参考方案1】:

从 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

【讨论】:

你是指第一个例子还是第二个例子?那么,截至 2019 年,任何特定版本的百里香叶是什么意思? 我可以确认这行得通!在 2019 年使用最新的百里香叶。这比使用 CDATAth:inline javascript 方法更好更干净,就像提到的其他答案一样。【参考方案2】:

我能够通过使用这种方法让它工作

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

感谢任何其他方法,例如例外中建议的方法。

【讨论】:

【参考方案3】:

试试这个方法。

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

我知道,另一个版本确实看起来好多了,但是由于它不起作用,这个版本还不错。当然,在这种情况下,我不建议将其添加到您的预兆中。

我觉得奇怪的是,我尝试了你的代码,它确实对我有用。谁知道你为什么会收到这个错误。

【讨论】:

我刚刚尝试了你的代码 sn-p 并且它不起作用。我意识到问题在于“String”变量被传递给处理程序(onload)中的javascript函数。升级后我开始收到此错误,可能是由于更新。 github.com/thymeleaf/thymeleaf/issues/705 甚至不是使用th:if的那个?我尝试了他们两个,他们工作。必须是更新,但这很奇怪。 if 中的那个也给出了错误,但要求我将内容放在两个单独的块中。我认为这是因为更新,他们将其设为严格模式,不允许根据异常直接在句柄中传递字符串。但再次感谢您,因为我从您的回复中学到了一些新东西。

以上是关于在此上下文中仅允许返回数字或布尔值的变量表达式的主要内容,如果未能解决你的问题,请参考以下文章

org.thymeleaf.exceptions.TemplateProcessingException:在此上下文中只允许返回数字或布尔值的变量表达式

错误:“在此上下文中仅支持原始类型或枚举类型”

TSQL 错误:不能在此上下文中使用具有返回值的 RETURN 语句

在此上下文中不能使用具有返回值的 RETURN 语句

Swift学习笔记:闭包

SQLServer 空间查询返回错误在预期条件的上下文中指定的非布尔类型的表达式,靠近 ')'