检测Grails中的重定向

检测Grails中的重定向,grails,Grails,在我的save操作结束时,我重定向到show操作,如下所示: redirect(action: "show", id: exampleInstance.id) 在我的show操作中,我希望能够检测到是否有人通过url直接访问此操作,或者他们是否从另一个操作重定向到此操作。我尝试了request.isRedirected(),但它总是返回false 如何检测我是否由于另一个操作的重定向而处于某个操作中?理论上,isRedirect检查请求属性。相当于 import org.codehaus.gr

在我的
save
操作结束时,我重定向到
show
操作,如下所示:

redirect(action: "show", id: exampleInstance.id)
在我的
show
操作中,我希望能够检测到是否有人通过url直接访问此操作,或者他们是否从另一个操作重定向到此操作。我尝试了
request.isRedirected()
,但它总是返回
false


如何检测我是否由于另一个操作的重定向而处于某个操作中?

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

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

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

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

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

请直接尝试,然后告诉我发生了什么。

我想您需要显示一条确认消息。Grails为此类用例提供了一个内置功能:

请看下面的示例:

class BookController {

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

在视图中,您可以打印或对照flash.message检查。我想您需要显示确认消息。Grails为此类用例提供了一个内置功能:

请看下面的示例:

class BookController {

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

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

在Grails源代码中,似乎
isRedirected()
仅适用于
保存
操作,因为它是在
重定向()
方法逻辑中设置的,因此不会在
显示
操作中设置

相反,这里有一些手动选项。一种是向
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请求
show
操作时,
chainModel
将不存在:

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

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

在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请求
show
操作时,
chainModel
将不存在:

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

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

同样的事情在这里(Grails 2.0.4),request.isRedirected()返回false。同样的事情在这里(Grails 2.0.4),request.isRedirected()返回false。我实际上想要同时显示多条消息。与Grails默认为
flash.message
分配单个字符串不同(正如您在示例中所做的),我为
flash.message
分配了一个列表,并在执行控制器操作时将消息添加到该列表中。如果发生重定向,则有可能
flash.message
中已经有消息,因此我不想创建新列表。相反,我想添加到现有列表中。这有意义吗?Flash只是一张任意的地图。例如,您可以使用
flash.asdf
。@在Grails中键入flash。你可以把你想要的放在上面,但只能在下一个请求中得到。是的,我知道flash是一张地图。我试图建立一个列表地图,其中一个列表名为
消息
。然后,我可以在每页上显示
flash.messages的全部内容。实际上,我希望同时显示多条消息。与Grails默认为
flash.message
分配单个字符串不同(正如您在示例中所做的),我为
flash.message
分配了一个列表,并在执行控制器操作时将消息添加到该列表中。如果发生重定向,则有可能
flash.message
中已经有消息,因此我不想创建新列表。相反,我想添加到现有列表中。这有意义吗?Flash只是一张任意的地图。例如,您可以使用
flash.asdf
。@在Grails中键入flash。你可以把你想要的放在上面,但只能在下一个请求中得到。是的,我知道flash是一张地图。我试图建立一个列表地图,其中一个列表名为
消息
。然后我可以在每页上显示
flash.messages
的全部内容。