Начиная с версии Grails 2.3 все выражения $ {} автоматически выводятся на GSP. Это очень полезно, потому что пользовательский ввод теперь экранируется, и любой HTML или JavaScript во входном значении экранируется и не интерпретируется браузером как HTML или JavaScript. Это сделано для того, чтобы наше приложение Grails было защищено от атак межсайтового скриптинга (XSS).
Но иногда мы хотим выводить неэкранированный HTML-контент в веб-браузер. Например, мы сами генерируем значение и знаем, что оно безопасно и его нельзя использовать для атак XSS. В Grails 2.3 мы можем использовать новый метод raw()
в наших GSP, библиотеках тегов или контроллерах. Метод оставит содержимое без изменений и вернет неэкранированное значение для отображения. В качестве альтернативы мы можем использовать encodeAsRaw()
для содержимого, которое мы хотим оставить без экранирования. Наконец, тег encodeAs
принимает значения Raw
или None
качестве значений для codec
атрибута и возвращает неэкранированное значение.
В следующем примере GSP мы отображаем значение свойства модели content
переданного на страницу. Значение устанавливается контроллером и является <em>sample</em> content
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
... < 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 > ... |
В нашем веб-браузере мы видим следующий вывод: