检测Grails中的重定向

时间:2012-09-04 20:00:47

标签: grails

在我的save操作结束时,我会重定向到这样的show操作:

redirect(action: "show", id: exampleInstance.id)

在我的show操作中,我希望能够检测是否有人通过网址直接进入此操作,或者是否将其从另一个操作重定向到此处。我尝试request.isRedirected()但它总是返回false

如何检测我是否因为来自其他操作的重定向而处于某个操作中?

3 个答案:

答案 0 :(得分:1)

我想您要显示确认消息。 Grails有这种用例的内置功能:

http://www.grails.org/doc/2.1.0/ref/Controllers/flash.html

看看这个例子:

class BookController {

    def save() { 
        flash.message = "Welcome!" 
        redirect(action: 'home') 
    }
}

在视图中,您可以打印或查看flash.message

答案 1 :(得分:0)

理论上,isRedirect检查请求属性。它相当于

import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes
if(request.getAttribute(GrailsApplicationAttributes.REDIRECT_ISSUED) != null){
    println "request was redirect"
}

直接尝试并告诉我会发生什么。

答案 2 :(得分:0)

在Grails源代码中,isRedirected()仅适用于save操作,因为它在redirect()方法逻辑中设置,因此不会在show行动。

相反,这里有一些手动选项。一种是向flash对象添加一个标志,然后在重定向操作中对其进行测试。由于它在闪存范围内,因此将在show操作结束时清除:

 def save() {
     // Do stuff
     flash.redirectFrom = "save"
     redirect(action:"show")
 }

 def show() {
     if (flash.redirectFrom) {
         // Respond to redirect
     }
     // Do other stuff
 }

另一个选择是发出chain()调用而不是redirect()并测试隐式chainModel对象。从外部URL请求chainModel操作时,show将不存在:

 def save() {
     // Do stuff
     chain(action:"show",model:[from:'show'])
 }

 def show() {
     if (chainModel) {
         // Respond to redirect
     }
     // Do other stuff
 }