рендеринг содержимого BLOB-объекта в виде кода вместо текста - PullRequest
0 голосов
/ 07 марта 2012

У меня есть следующий код, сохраненный в базе данных oracle в виде поля blob, в основном html и встроенный код groovy с sql, который возвращает некоторые значения

<%
        import groovy.sql.Sql

        def sql = Sql.newInstance("jdbc:mysql://localhost:3306/myDB","root", "root", "com.mysql.jdbc.Driver")
%>

<html>
        <head>
                <title>Database Example</title>
        </head>
        <body>
                <table align="center" border="1">
                        <tr>
                                <td>Id</td>
                                <td>LastName</td>
                                <td>FirstName</td>
                        </tr>
                        <% sql.eachRow("select profile_id profileId, last_name lastName, first_name firstName from profile") {profile->  %>
                                <tr>
                                        <td>${profile.profileId}</td>
                                        <td>${profile.lastName}</td>
                                        <td>${profile.firstName}</td>
                                </tr>
                        <% } %>
                </table>
        </body>
</html>

Теперь у меня есть указанное выше значение BLOB-объекта в переменной thistemplate.contents, которое я пытаюсь отобразить в renderthistemplate.gsp, как показано ниже:

def renderString= g.render(template:"myController/renderthistemplate",model:[rendertemplate:thistemplate.contents])

Теперь в gsp я просто делаю ${rendertemplate}, чтобы распечатать весь блоб. Ожидается, что он должен выполнить весь BLOB-объект как код и отобразить вывод. Но это на самом деле печать содержимого большого двоичного объекта в виде простой строки, ни HTML, ни код groovy не выполняются в целевом GSP. Как я могу получить целевой GSP для отображения содержимого блоба как кода, а не как строки / текста Спасибо Priyank

1 Ответ

1 голос
/ 07 марта 2012

Вы не можете. По соображениям безопасности специальные символы в строке должны быть экранированы, или хакеры могут ввести следующее имя: me'; delete from user;, которое удалит все данные в пользовательской таблице, как только вы отобразите имя на веб-странице (упрощенный пример, но вы получаете идея).

Вы можете визуализировать большой двоичный объект как текст , используя contentType:"text/html", но это не будет запускать код в блоках <% %>.

Решение - создать собственный динамический шаблон. Для этого вам нужны две вещи:

  1. Создайте новое поле в вашем контроллере:

    GroovyPagesTemplateEngine groovyPagesTemplateEngine
    
  2. Используйте этот код для рендеринга BLOB-объекта:

    groovyPagesTemplateEngine.createTemplate(blobAsString, “somepage.gsp”).make(model).writeTo(out)
    

пример кода из: Grails - рендеринг шаблона из строки

...