从另一个控制器操作中检测请求是否为“ forward()”的正确方法是什么?

时间:2019-08-12 10:43:50

标签: grails grails-2.0

我有几个“之前”类型的过滤器,仅当真正的,未转发的请求到达服务器时才触发。并非如此,当我有时将请求转发给另一个控制器/操作以进行进一步处理时。

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

或者,我正在考虑解析请求url,并检查控制器和动作是否与当前的控制器/动作匹配,但是我不确定这是否行得通-这肯定是处理此问题的难看方法。 ..

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

1 个答案:

答案 0 :(得分:3)

您可以通过查找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