Сохранять новые строки при использовании HTML-кодека в представлениях Grails - PullRequest
5 голосов
/ 04 ноября 2011

Функция предотвращения Grails XSS довольно удобна, поэтому я включил ее с помощью:

grails.views.default.codec = "html"

Хотя это создает проблему с html textareas.Если мы завершим textarea и используем Enter, чтобы разбить строки, новые строки сохраняются в БД, но они игнорируются в представлении.Я мог бы использовать <%=%> и replaceAll('\n',"<br>") для исправления разрывов строк, но HTML-код, заполненный textarea, не был бы экранирован, и не было бы предотвращения XSS!

Как бы вы решили эту проблему?

1 Ответ

10 голосов
/ 04 ноября 2011

Перед рендерингом текстовой области обратно в GSP вы можете

  • закодируйте вашу строку как HTML
  • конвертировать символы новой строки в <br/>.

Этого можно достичь, сохранив следующую библиотеку тегов в grails-app / taglib:

class LinesTagLib { 
  def lines = { attrs, body -> 
    out << attrs['string'].encodeAsHTML().replace('\n', '<br/>\n')
  } 
}

Поскольку мы уже применили encodeAsHTML () в теге, вам придется отключить кодек HTML при использовании тега (используя <%=expression%> вместо ${expression}):

    <g:lines string="<%=savedTextarea%>" />

Альтернативой будет написать собственный кодек для этого:

class HTMLLinesCodec{ 
  static encode = { str -> 
    str.encodeAsHTML().replace('\n', '<br/>\n')
  } 
}

Затем вы можете использовать этот кодек для файлов GSP, где вы хотите, чтобы это поведение, добавив директиву:

<%@ defaultCodec="HTMLLines" %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...