在Grails中,flash
storage object用于保留cross request data like messages。
我知道可以从大多数视图和控制器访问它,但是我不确定它是否可以在Grails中普遍使用,或者它是否只能从某些传统对象访问。
例如,可以从flash
访问Services
对象吗?
甚至在实时网络请求期间的任何地方?
访问方面有哪些精确限制?
答案 0 :(得分:18)
您可以随时随地访问flash
,更重要的是,只要您有权访问网络请求,就可以访问flash
。通常,您可以从GrailsWebRequest
对象获取import org.codehaus.groovy.grails.web.util.WebUtils
def grailsWebRequest = WebUtils.retrieveGrailsWebRequest()
// request is the HttpServletRequest
def flash = grailsWebRequest.attributes.getFlashScope(request)
。
IllegalStateException
如果您在网络请求的上下文之外调用retrieveGrailsWebRequest()
,则会获得GrailsWebRequest
。 ConcurrentHashMap
通过过滤器GrailsWebRequestFilter
绑定到当前线程,该过滤器在服务请求的早期执行。所以基本上,只要你在请求的上下文和“内部”这个过滤器执行,你应该能够访问闪存。
除此之外,请查看org.codehaus.groovy.grails.web.servlet.DefaultGrailsApplicationAttributes
的来源。闪存存储器保存在会话中,因此理论上,一旦您获得对会话的访问权限,您就应该可以使用它。但要小心,因为它在会话的不同请求之间共享。提到的过滤器负责在整个请求中提升flash的状态,实质上是从2个元素的队列中弹出{{1}}。
答案 1 :(得分:5)
只要您处于请求的上下文中,就可以使用
访问闪存范围import org.codehaus.groovy.grails.web.util.WebUtils
def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope
(Grails脚本和Quartz作业是Grails应用程序中不在请求上下文中的位置的示例)