检测请求是否是来自另一个控制器操作的 "forward()" 的正确方法是什么?

What is the right way to detect if a request is a "forward()" from another controller action?

我有几个 "before" 类型的过滤器,我只想在真正的、未转发的请求到达我的服务器时触发它们。而不是,当我有时将请求转发给另一个 controller/action 以进行进一步处理时。

我的问题是是否有一种简单的方法来检测由 "forward()" 调用引起的这种特定类型的请求?

或者,我正在考虑解析请求 url 并检查控制器和操作是否与当前的 controller/action 匹配,但我不确定这是否可行 - 确实相当处理这个问题的丑陋方式...

在我的控制器操作中,我试图查看请求对象上是否有用于此目的的任何有用属性,但找不到任何属性,除了 "javax.servlet.forward.request_uri" 和 "org.codehaus.groovy.grails.CONTROLLER_NAME_ATTRIBUTE" +"org.codehaus.groovy.grails.ACTION_NAME_ATTRIBUTE"。 但是,如果请求 uri 源自 UrlMapping,则将这些值相互比较似乎不起作用(在这种情况下,它可能与 controller/action)

不匹配

您可以通过查找 servlet 属性来确定是否转发了请求 org.grails.FORWARD_CALLED:

request.getAttribute('org.grails.FORWARD_CALLED')

最小示例(在 Grails 3.3.9 中,尽管 2.5.x 中的属性相同):

def index() {
    forward action: 'fwd'
}

def fwd() {
    if (request.getAttribute('org.grails.FORWARD_CALLED')) {
        render 'was called by forward'
    } else {
        render 'called directly'
    }
}

调用端点:

$ curl localhost:8080/foo/index
was called by forward
$ curl localhost:8080/foo/fwd
called directly