我正在尝试使用测试grails应用上的过滤器添加自定义标头。我已经设置了这样的过滤器:
class MyFilters {
def filters = {
addHeader(uri: '/*') {
after = { Map model ->
response.setHeader('X-Test-Header', '123')
}
}
}
}
如果我尝试访问控制器并检查标题:
curl -I -H "Accept: text/html" -X GET 'http://localhost:8080/Test1/doSomething'
然后,我得到了额外的标题:X-Test-Header:123但如果我使用“Accept:application / json”尝试上面的curl,我将内容作为JSON但我没有得到任何额外的标题。
我做错了什么?
我忘了提到我正在尝试新的grails REST功能,而我的控制器扩展了RestfulController
编辑:我做了一些额外的实验。我添加了另一个过滤器作为groovy类并修改了web.xml(得到了this article - grails-add-header-to-every-response的想法,它不适用于application / json但是对text / html有效!是否可能扩展{{ 3}}绕过标准过滤器?EDIT2:添加标题似乎适用于application / xml和text / xml,但不适用于application / json和text / json。我越是看它,它看起来像一个错误而不是我做错了,因为我在一个全新的VM上看到一个全新项目的完全相同的行为(以防我的开发机器有某种奇怪的配置)。我将在JIRA
上创建一个错误报告EDIT3:打开RestfulController,当我知道更多时,我会更新此任务
EDIT4:根据JIRA case,它似乎是一个错误,它将在grails 2.3.4上更正
答案 0 :(得分:1)
打开JIRA case。似乎“after”动作允许在渲染视图之前修改模型,但是响应方法在输出响应后呈现JSON并执行“after”动作(因此,修改响应为时已晚)。因此,根据Graeme Rocher的说法,解决方法是在“之前”块或操作中添加标题,如下所示:
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
response.setHeader('X-MyHeader', '123')
respond Person.list(params), model:[personInstanceCount: Person.count()]
}
因此,这将纠正索引操作的行为