“render as JSON”之后为响应添加自定义标头

时间:2013-06-04 14:45:58

标签: grails grails-2.0 grails-controller

我正在尝试使用Grails过滤器将自定义HTTP标头添加到某组控制器的响应中:

class ApiFilters {
   def filters = {
      xwingFilter(uri:'/api/**') {
         after = {
            response.setHeader('X-Wing', 'foo')
         }
      }
   }
}

如果控制器呈现视图或文本,则标题会添加到响应中。 如果控制器使用“render as JSON”,则不添加标头。看起来JSON转换器正在关闭输出流并立即发送它。是吗?

我可以使用Grails拦截器,但我必须在多个控制器中复制它。 关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:4)

您可以在过滤器中执行从模型到JSON的转换,而不是操作:

控制器:

class myController {
    def myAction() {
        [aThing: 1, anotherThing: [a: 1, b: 2]]
    }
}

过滤器:

class ApiFilters {
    def filters = {
        xwingFilter(uri:'/api/**') {
            after = { model ->
                response.setHeader('X-Wing', 'foo')
                render model as JSON
                return false // prevent normal view from rendering
            }
        }
    }
}