将grails.views.default.codec配置重写为'none'

45
在Grails(<2.3)中,如果我在grails Config.groovy中保留grails.views.default.code='none',则我需要在GSP文件中显式地对表达式进行HTML编码:${myValue?.encodeAsHTML()}
如果我在Config.groovy中设置grails.views.default.codec='html",那么每个表达式都会自动进行HTML编码:${myValue}
我的问题是:如果我将默认设置为'html',当我不想要HTML编码行为时,如何将其改回'none'以应用于一个表达式?
6个回答

64

概括一下编解码器可以应用的不同层次:

将 Config.groovy 中的 grails.views.default.codec='html' 设置为默认值,以便在应用程序中对所有 ${expressions} 进行 HTML 转义。

然后,当您想要将整个页面恢复到无编解码状态时,请使用该指令:

<%@page defaultCodec="none" %>
或者
<%@ defaultCodec="none" %>
要在一个页面中禁用默认为HTML编码的情况下的一个表达式的HTML编码,可以使用<%=expression%>记法,而不是${...}

10
这个解决方案已经不再适用。相反,你需要使用“raw”方法:${raw(expression)} - A.J. Brown
我需要用新的Grails重新审视这个问题。他们可能让它变得更容易了。 - John Flinchbaugh
2
@A.J.Brown 如果你仍在使用<2.3版本,它仍然有效;) - Charles Wood
哎呀,我以为在Grails 2.4.3中以上所有内容都无法运行,但我错了。只是不要在表达式部分使用 "println" - 这将仍然对其进行编码! - Jörg Rech
@A.J.Brown,感谢您提供${raw(expr)},正是我在寻找的。您知道它的文档在哪里吗?毕竟它被引入已经快一年了,一定有文档记录吧? - Tobia
1
@Tobia,这在文档中有提到(至少在2.3文档中),但它的出现时间非常短暂:http://grails.org/doc/2.3.0.M1/guide/security.html - A.J. Brown

8
如果将默认编码级别设置为HTML,可以使用以下配置:

grails.views.default.codec = "html"

然后,如果要在页面中取消对一个表达式的HTML编码,可以使用以下语法:

${raw(expression)}


仅适用于Grails >= 2.3,请参见http://mrhaki.blogspot.fr/2013/11/grails-goodness-generating-raw-output.html。该问题针对Grails < 2.3。请参见下面的John Flinchbaugh答案。 - BenC

7
尝试使用 ${raw(myValue)} ,您不需要声明页面编解码等信息。

5

根据GRAILS-1827,似乎你可以使用特定的方法覆盖默认编解码器来处理某个页面。

<%@ defaultCodec="HTML" %>

或者
<%@page defaultCodec="HTML" %>

在某些版本中(请参见引用的问题)。

1

编写自己的标签,并将表达式直接写入输出流:

class YourTagLib {

    static namespace = "x"

    def unescaped = { attrs, body ->
        out << attrs.value
    }

}

在你的GSP中使用它:
<x:unescaped value="${yourexpression}"/>

1

我可能有一个解决方案,但不确定它有多可接受。

我可以将表达式的默认编解码器设置为HTML,然后在GSP中使用<%=myValue%>符号代替${}表达式来将未转义的值呈现在页面上。


你在其他答案中说得比这个多。这一个没有添加任何内容。 - cdeszaq
@cdeszaq 看看日期。更完整的答案是后来才出现的。(而且它们都来自2009年(你的评论比我的早一年)。):| - Charles Wood
@CharlesWood 我的意思是这个低劣的回答应该被删除。对于没有表达清楚,我表示歉意。 - cdeszaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接