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

Session Grails:在用户会话期间存储数据的最佳方法,session,grails,controller,domain-model,user-data,Session,Grails,Controller,Domain Model,User Data,以下哪种方法被认为是在用户会话期间在grails中存储数据的推荐方法 在实际会话中存储一组单独的变量 在会话中存储域模型类对象 使用会话范围的控制器,并将变量存储为控制器字段或属性 使用会话范围的控制器,并将数据存储为存储在控制器中的域模型类对象 我还没有想到的其他方法 我喜欢将会话范围的服务用于这类事情。使用这种方法,您可以将会话范围服务的代理注入到全局范围服务(或控制器)中,这意味着您不必担心跟踪放入会话的内容 有一个很好的小教程,向您展示了如何混合不同范围的服务。而且,该教程的作者似乎还编

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

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

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

    有一个很好的小教程,向您展示了如何混合不同范围的服务。而且,该教程的作者似乎还编写了一个插件,以简化该过程(尽管我还没有尝试过该插件)

    编辑:

    下面是一个示例,展示了如何设置此设置&实际使用服务代理将内容传递到视图:

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

    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]
        }
    }
    

    正如sudhir已经指出的那样,直接存储在会话中的映射对我来说是最简单和最理想的方式。

    我不会存储单个变量或整个域对象。而是将地图存储在会话中!或者自定义对象,该对象具有要在会话中存储的内容的属性。您可以使用会话范围的服务。您建议如何将存储在服务中的数据传递给视图?我编辑了我的答案以提供一个示例感谢您的详细解释。