从Grails 2.3开始,所有$ {}表达式输出都会在GSP上自动转义。 这非常有用,因为现在可以转义用户输入,并且转义输入值中的任何HTML或JavaScript,并且浏览器不会将其解释为HTML或JavaScript。 这样做是为了保护我们的Grails应用程序免受跨站点脚本(XSS)攻击。
但是有时候我们确实想在Web浏览器中输出未转义HTML内容。 例如,我们自己生成值,并且我们知道该值是安全的,不能被XSS攻击滥用。 在Grails 2.3中,我们可以在GSP,标签库或控制器中使用新的raw()
方法。 该方法将使内容保持不变,并返回要显示的未转义值。 另外,我们可以在要保留其转义的内容上使用encodeAsRaw()
。 最后, encodeAs
标记接受Raw
或None
作为属性codec
值,并将返回未转义的值。
在下面的示例GSP中,我们显示传递到页面的content
模型属性的值。 该值由控制器设置,且为<em>sample</em> content
。
...
<h2>Raw output samples</h2>
<table>
<tr><th>Expression</th><th>Result</th></tr>
<tr>
<td>${'${content}'}</td>
<td>${content}</td>
</tr>
<tr>
<td>${'${raw(content)}'}</td>
<td>${raw(content)}</td></tr>
<tr>
<td>${'${content.encodeAsRaw()}'}</td>
<td>${content.encodeAsRaw()}</td>
</tr>
<tr>
<td>${'<g:encodeAs codec="Raw">${content}</g:encodeAs>'}</td>
<td><g:encodeAs codec="Raw">${content}</g:encodeAs></td>
</tr>
<tr>
<td>${'<g:encodeAs codec="None">${content}</g:encodeAs>'}</td>
<td><g:encodeAs codec="None">${content}</g:encodeAs></td>
</tr>
</table>
...
在我们的Web浏览器中,我们看到以下输出:
翻译自: https://www.javacodegeeks.com/2013/11/grails-goodness-generating-raw-output-with-raw-codec.html