【问题标题】:Grails 2.4.0 filtersGrails 2.4.0 过滤器
【发布时间】:2026-01-23 06:15:01
【问题描述】:

我创建了一个过滤器类并在那里添加了 CORS 标头。重新启动的应用程序(也尝试过清理、编译……甚至重新启动 eclipse)但我的 REST 控制器没有在响应中设置这些标头。有关如何调试的任何指示?可能是我做错了什么,但从文档看来,我需要做的就是在 Grails 中添加过滤器 (filters)

class AddcorsheadersFilters {

    def filters = {
        all(controller:'*', action:'*') {
            before = {

            }
            after = { Map model ->
                response.setHeader('Access-Control-Allow-Origin', '*')
                response.setHeader('Access-Control-Allow-Methods', 'POST, PUT, GET, OPTIONS, PATCH')
                response.setHeader('Access-Control-Allow-Headers', 'X-Additional-Headers-Example')
                response.setHeader('Access-Control-Allow-Credentials', 'true')
                response.setHeader('Access-Control-Max-Age', '1728000')

            }
            afterView = { Exception e ->

            }
        }
    }
}

【问题讨论】:

    标签: grails


    【解决方案1】:

    根据JIRA ticket,这个问题众所周知,根本无法解决。

    respond 方法将呈现提交响应的 JSON。此时添加标题为时已晚。需要在“之前”块或操作中添加标题。将索引操作更改为

    作为替代解决方案,您可以使用 BeforeIntercepter 并将标头应用于控制器中的所有操作。

    票也很可能与Grails doesn't add headers for json有关

    【讨论】:

    • 谢谢。添加到“之前”,我可以看到标题。
    【解决方案2】:

    简而言之,您做错了什么是您在设置标题之后设置标题! after 块在处理完成后但在视图呈现之前被调用。这意味着在调用after 块时,标头已经设置(我不确定,但也可能被发送)!

    解决方案是在处理任何内容之前设置标题! before 块甚至在控制器被调用之前就被调用了,处理从那里开始!因此将是在那里设置标题的理想位置!!!

    【讨论】: