You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qute模板引擎中正确注入可正常执行的JS脚本

Qute模板注入JS脚本被转义的解决方法

Qute默认会对HTML上下文的插值内容做HTML实体转义,用来防范XSS攻击,这就是你脚本里的单引号被转成'的原因。你可以通过以下两种方式解决:

方案1:模板侧使用raw过滤器(推荐,改动最小)

直接在模板的插值变量后追加.raw后缀,通知Qute不对该内容做转义直接输出:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>redirect by script</title>
    </head>
    <body>
        <p>Hi {name}!</p>
    <script>
        {script.raw}
    </script>
    </body>
</html>

后端代码不需要做任何修改。

方案2:后端侧标记内容为安全原始值

如果你不想修改模板,可以在后端传值时将脚本内容包装为io.quarkus.qute.RawValue类型,Qute识别到该类型的参数会自动跳过转义:

import io.quarkus.qute.RawValue;

@RequestScoped
public class Resource {
  @Inject
  @Location("hello.html")
  Template hello;

@Route(path = "/s/:name", methods = HttpMethod.GET)
  public Uni<String> rScript(RoutingContext rc) {
    String s = "console.log('Hi from script');";
    return Uni.createFrom().completionStage(() -> hello
            .data("name", rc.request().getParam("name"))
            .data("script", new RawValue(s))
            .renderAsync());
  }
}

注意:关闭转义会带来XSS注入风险,如果你的脚本内容包含用户可控的输入,一定要提前做严格的内容校验,禁止直接输出未校验的用户提交内容作为脚本执行。

内容的提问来源于stack exchange,提问作者Ali Malek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:36:04