Arvind
Arvind

Reputation: 61

grails response.addHeader or setHeader is not possible in filter once response.setContentType is touched in controller action

In my controller action i tried to set the contentType of the response as below.

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

In the filter i tried to set the header for all controller and action params

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

Header is added for all other actions except for the action in which response contentType is modified. It seems like response.isCommitted() is returned as true in that action alone. Am i am not understanding the basic of rendering...?

Also this is not the case if i use render(view:'/abc') instead of view(template:'/abc', model:[:])

Thanks in advance

Upvotes: 6

Views: 2770

Answers (1)

Aquatoad
Aquatoad

Reputation: 788

It looks like rendering a template sends the template immediately when called, as it's showing up as already committed in the filter. Since it's committed the headers have already been sent and setting a header after the fact doesn't make sense, so the setHeader in the Filter gets ignored.

My guess is this is a peculiarity to rendering templates specifically, and in those cases you'll need to set the cache header in the controller action explicitly, or use view rendering instead.

Upvotes: 1

Related Questions