grails response.addHeader или setHeader невозможны в фильтре, если в действии контроллера затронут response.setContentType - PullRequest
6 голосов
/ 04 января 2012

В своем действии контроллера я попытался установить contentType ответа, как показано ниже.

class MyController {
   def rss = {
       response.setContentType('text/xml')
       //I even tried setHeader('contentType') and also render(contentType:'text/xml',...)
       render(template:'/displayRss', model:[:])
   }
}

В фильтре я попытался установить заголовок для всех параметров контроллера и действия

class Filter {
   def filters = {
      all(controller:'*', action:'*'){
         after = { 
            response.setHeader('Cache-Control', 'no-cache')
         }
      }
   }
}

Заголовок добавляется для всех других действий, кроме действия, в котором изменен ответ contentType. Кажется, что response.isCommitted () возвращается как true только в этом действии. Разве я не понимаю основы рендеринга ...?

Также это не тот случай, если я использую render (view: '/ abc') вместо view (template: '/ abc', model: [:])

Заранее спасибо

1 Ответ

1 голос
/ 11 апреля 2013

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

Полагаю, это особенность рендеринга шаблонов, и в этих случаях вам нужно явно установить заголовок кэша в действии контроллера или использовать вместо него рендеринг вида.

...