我有几个“之前”类型的过滤器,仅当真正的,未转发的请求到达服务器时才触发。并非如此,当我有时将请求转发给另一个控制器/操作以进行进一步处理时。
我的问题是,是否有一种简单的方法来检测由“ forward()”调用引起的这种特殊类型的请求?
或者,我正在考虑解析请求url,并检查控制器和动作是否与当前的控制器/动作匹配,但是我不确定这是否行得通-这肯定是处理此问题的难看方法。 ..
在我的控制器操作中,我试图查看请求对象上是否有用于此目的的有用属性,但找不到任何属性,除了“ javax.servlet.forward.request_uri”和“ org.codehaus”之外。 groovy.grails.CONTROLLER_NAME_ATTRIBUTE“ +” org.codehaus.groovy.grails.ACTION_NAME_ATTRIBUTE“。 但是,如果请求uri源自UrlMapping,则似乎无法将这些值相互比较(在这种情况下,它可能与控制器/操作不匹配)
答案 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