【问题标题】:In Grails can the flash storage object only be accessed from controllers and views?在 Grails 中,闪存对象只能从控制器和视图中访问吗?
【发布时间】:2011-06-17 22:26:50
【问题描述】:

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

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

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

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

在访问方面的确切限制是什么?

【问题讨论】:

    标签: grails


    【解决方案1】:

    您可以随时随地访问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)
    

    如果您在 Web 请求的上下文之外调用 retrieveGrailsWebRequest(),您将获得一个 IllegalStateException。 GrailsWebRequest 通过过滤器GrailsWebRequestFilter 绑定到当前线程,该过滤器在服务请求的早期执行。所以基本上,只要你在请求的上下文中并且“在”这个过滤器执行中,你应该能够访问闪存。

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

    【讨论】:

      【解决方案2】:

      只要您在请求的上下文中,您就可以访问 flash 范围

      import org.codehaus.groovy.grails.web.util.WebUtils
      
      def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-22
        • 2019-04-03
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 2013-09-04
        • 1970-01-01
        相关资源
        最近更新 更多