在Grails中,flash
storage object用於保存cross request data like messages。在Grails中,只能從控制器和視圖訪問閃存存儲對象嗎?
我知道它可以從大多數視圖和控制器訪問,但我不確定它是否可以在Grails中普遍使用,或者只能從某些常規對象訪問它。
可以從Services
訪問flash
對象嗎?
甚至在實時網絡請求期間的任何地方?
什麼是訪問方面的確切限制?
在Grails中,flash
storage object用於保存cross request data like messages。在Grails中,只能從控制器和視圖訪問閃存存儲對象嗎?
我知道它可以從大多數視圖和控制器訪問,但我不確定它是否可以在Grails中普遍使用,或者只能從某些常規對象訪問它。
可以從Services
訪問flash
對象嗎?
甚至在實時網絡請求期間的任何地方?
什麼是訪問方面的確切限制?
無論何時,無論何時,無論何時訪問Web請求,您都可以訪問flash
。一般來說,您可以從GrailsWebRequest
對象中獲得flash
。
import org.codehaus.groovy.grails.web.util.WebUtils
def grailsWebRequest = WebUtils.retrieveGrailsWebRequest()
// request is the HttpServletRequest
def flash = grailsWebRequest.attributes.getFlashScope(request)
如果調用retrieveGrailsWebRequest()
web請求的範圍之外,你會得到一個IllegalStateException
。 GrailsWebRequest
通過在服務請求中早期執行的過濾器GrailsWebRequestFilter
綁定到當前線程。所以基本上,只要你處於請求的上下文中,並且在這個過濾器執行的「內部」,你應該能夠訪問閃存。
除此之外,請看org.codehaus.groovy.grails.web.servlet.DefaultGrailsApplicationAttributes
的來源。閃存存儲在會話中,所以理論上你應該可以在訪問會話後使用它。但要小心,因爲它在會話的不同請求中共享。所提到的過濾器負責推進整個請求中的閃存狀態,實質上是從2元素隊列中彈出一個ConcurrentHashMap
。
只要你是你可以訪問閃存範圍要求的範圍內
import org.codehaus.groovy.grails.web.util.WebUtils
def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope
(Grails腳本和Quartz作業不在範圍內的一個Grails應用程序的地方例子的要求)