在Grails中,flash存储对象用于保存交叉请求数据,如消息.
我知道它可以从大多数视图和控制器访问,但我不确定它是否可以在Grails中普遍使用,或者它是否只能从某些传统对象访问.
例如,可以flash从中访问对象Services吗?
甚至在实时网络请求期间的任何地方?
在访问方面有什么限制?
Gus*_*dez 18
您可以访问flash任何地方,更重要的是,只要您有权访问Web请求.通常,您可以flash从GrailsWebRequest对象中获取.
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 .
只要您处于请求的上下文中,就可以访问闪存范围
import org.codehaus.groovy.grails.web.util.WebUtils
def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope
Run Code Online (Sandbox Code Playgroud)
(Grails脚本和Quartz作业是Grails应用程序中不在请求上下文中的位置的示例)