grails response.addHeader 或 setHeader 在 Controller 操作中触摸 response.setContentType 后在过滤器中是不可能的

标签 grails grails-filters

在我的 Controller 操作中,我尝试将响应的 contentType 设置为如下。

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

在过滤器中,我尝试为所有 Controller 和 Action 参数设置标题
class Filter {
   def filters = {
      all(controller:'*', action:'*'){
         after = { 
            response.setHeader('Cache-Control', 'no-cache')
         }
      }
   }
}

除了修改响应 contentType 的操作之外,所有其他操作都会添加 header 。似乎 response.isCommitted() 仅在该操作中返回为 true 。我是不是不了解渲染的基础知识......?

如果我使用 也不是这种情况渲染( View :'/abc')而不是 View (模板:'/abc',模型:[:])

提前致谢

最佳答案

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

我的猜测是,这是专门渲染模板的一个特性,在这些情况下,您需要在 Controller 操作中显式设置缓存 header ,或者改用 View 渲染。

关于grails response.addHeader 或 setHeader 在 Controller 操作中触摸 response.setContentType 后在过滤器中是不可能的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720140/

相关文章:

session - 如何在grails中实现cookie、用户跟踪?

grails - 如何编写Grails过滤器的集成测试

html - HTML&GRAILS-URL文本不显示为超链接

validation - Grails验证程序未返回预期的消息

grails - 在特定操作后保留排序 - Grails

grails - 如何从 grails 过滤器中去除通用逻辑?

maven - 由于 Maven 依赖关系,尝试运行新的 grails 项目失败

更新(使用新对象)列表时,Grails 代码失败,但没有找到匹配的编辑器或转换策略

grails - Grails过滤器 `actionExclude`是否可用于基于方法的路由?