在Grails中,只能从控制器和视图访问闪存存储对象吗?

Mar*_*ers 12 grails

在Grails中,flash存储对象用于保存交叉请求数据,如消息.

我知道它可以从大多数视图和控制器访问,但我不确定它是否可以在Grails中普遍使用,或者它是否只能从某些传统对象访问.

例如,可以flash从中访问对象Services吗?

甚至在实时网络请求期间的任何地方?

在访问方面有什么限制?

Gus*_*dez 18

您可以访问flash任何地方,更重要的是,只要您有权访问Web请求.通常,您可以flashGrailsWebRequest对象中获取.

import org.codehaus.groovy.grails.web.util.WebUtils

def grailsWebRequest = WebUtils.retrieveGrailsWebRequest()
// request is the HttpServletRequest
def flash = grailsWebRequest.attributes.getFlashScope(request)
Run Code Online (Sandbox Code Playgroud)

如果您retrieveGrailsWebRequest()在Web请求的上下文之外调用,您将获得一个IllegalStateException.在GrailsWebRequest由滤波器,绑定到当前线程GrailsWebRequestFilter,其在所述服务请求早期执行.所以基本上,只要你在请求的上下文和"内部"这个过滤器执行,你应该能够访问闪存.

除此之外,请查看源代码org.codehaus.groovy.grails.web.servlet.DefaultGrailsApplicationAttributes.闪存存储器保存在会话中,因此理论上,一旦您获得对会话的访问权限,您就应该可以使用它.但要小心,因为它在会话的不同请求之间共享.提到的过滤器负责在整个请求中提升flash的状态,实质上是ConcurrentHashMap从2元素队列中弹出a .


Dón*_*nal 6

只要您处于请求的上下文中,就可以访问闪存范围

import org.codehaus.groovy.grails.web.util.WebUtils

def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope
Run Code Online (Sandbox Code Playgroud)

(Grails脚本和Quartz作业是Grails应用程序中不在请求上下文中的位置的示例)