Grails:在用户会话期间存储数据的最佳方法[关闭]

Posted

技术标签:

【中文标题】Grails:在用户会话期间存储数据的最佳方法[关闭]【英文标题】:Grails: Best approach for storing data for the duration of the users session [closed] 【发布时间】:2014-01-25 04:27:31 【问题描述】:

以下哪种方法被认为是在用户会话期间将数据存储在 grails 中的推荐方法?

    在实际会话中存储一堆单独的变量。 在会话中存储域模型类对象。 使用会话范围的控制器并将变量存储为控制器字段或属性。 使用会话范围的控制器并将数据存储为存储在控制器中的域模型类对象。 我还没有想到的其他方式。

【问题讨论】:

我不会存储单个变量或整个域对象。而是将地图存储在会话中!或者一个自定义对象,它具有您要在会话中存储的内容的属性。您也可以使用会话范围的服务 【参考方案1】:

我喜欢为这类事情使用会话范围的服务。使用这种方法,您可以将会话范围服务的代理注入到全局范围服务(或控制器)中,这意味着您无需担心跟踪您放入会话中的内容。

有一个很好的小教程here 向您展示了如何混合不同范围的服务。看起来那个教程的作者也写了一个插件来简化这个过程(虽然我还没有真正尝试过这个插件)。

编辑:

这是一个示例,展示了您如何设置它并实际使用服务代理将内容传递到您的视图:

创建一个服务来保存会话范围内的东西,比如用户购物车或其他东西。它只是一个常规服务(引用其他服务等),但您可以将特定于会话的内容存储为成员变量 -

class MySessionScopedService 

    def currentUser
    def shoppingCart

    ...


resources.groovy 中,为您的服务设置会话范围的代理。与其直接将MySessionScopedService 注入其他服务,不如为它注入一个代理。

beans = 
    mySessionScopedServiceProxy(org.springframework.aop.scope.ScopedProxyFactoryBean) 
        targetBeanName = 'mySessionScopedService'
        proxyTargetClass = true
    

最后,当你想引用你的服务时,你引用代理(注意我引用的是mySessionScopedServiceProxy而不是mySessionScopedService)。您可以在任何全局范围的组件中引用代理,并且在运行时,Spring 将为当前会话注入正确的代理。

class MyController 
    def mySessionScopedServiceProxy
    def someOtherService

    def index() 
        [shoppingCart: mySessionScopedServiceProxy.shoppingCart, currentUser: mySessionScopedServiceProxy.currentUser]
    

【讨论】:

您建议如何将存储在服务中的数据传递给视图? 我编辑了我的答案以提供一个例子 感谢您的详细解释。【参考方案2】:

正如 sudhir 已经指出的那样,直接存储在会话中的地图对我来说是最简单和最值得期待的方式。

【讨论】:

以上是关于Grails:在用户会话期间存储数据的最佳方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在MySQL,Grails 2应用程序更长时间不活动期间保持池连接活动(或将它们计时并获得新的连接)的正确方法

在 Grails 中,如何访问域类静态方法中的休眠会话?

跨页面存储会话数据最佳实践

在注销期间破坏用户会话是不是足够?

在 Rails 中存储持久会话数据而不影响正常会话过期

Grails 中的控制器