Статьи

Grails Goodness: генерирование необработанного выхода с помощью необработанного кодека

Начиная с версии 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>
...

В нашем веб-браузере мы видим следующий вывод:

Код, написанный с помощью Grails 2.3.

Код, написанный с помощью Grails 2.3.