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

时间:2014-01-25 04:27:32

标签: session grails controller domain-model user-data

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

  1. 在实际会话中存储一堆个别变量。
  2. 在会话中存储域模型类对象。
  3. 使用会话范围控制器并将变量存储为控制器字段或属性。
  4. 使用会话范围控制器并将数据存储为存储在控制器中的域模型类对象。
  5. 我尚未想到的其他方式。

2 个答案:

答案 0 :(得分:3)

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

有一个很好的小教程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]
    }
}

答案 1 :(得分:0)

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