一旦在控制器操作中触及response.setContentType,则在过滤器中无法使用grails response.addHeader或setHeader

时间:2012-01-03 23:29:44

标签: grails grails-filters

在我的控制器操作中,我尝试将响应的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。我不理解渲染的基础......?

如果我使用渲染(视图:'/ abc')而不是视图(模板:'/ abc',模型:[:])

提前致谢

1 个答案:

答案 0 :(得分:1)

看起来渲染模板在调用时立即发送模板,因为它显示为已在过滤器中提交。由于它已经被提交,所以已经发送了标题并且在事实没有意义之后设置标题,因此过滤器中的setHeader被忽略。

我的猜测是这是特定渲染模板的特性,在这些情况下,您需要明确地在控制器操作中设置缓存标头,或者使用视图渲染。

相关问题