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

时间:2011-06-17 22:26:51

标签: grails

在Grails中,flash storage object用于保留cross request data like messages

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

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

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

访问方面有哪些精确限制?

2 个答案:

答案 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(),则会获得GrailsWebRequestConcurrentHashMap通过过滤器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应用程序中不在请求上下文中的位置的示例)