Session Grails:在用户会话期间存储数据的最佳方法
以下哪种方法被认为是在用户会话期间在grails中存储数据的推荐方法Session Grails:在用户会话期间存储数据的最佳方法,session,grails,controller,domain-model,user-data,Session,Grails,Controller,Domain Model,User Data,以下哪种方法被认为是在用户会话期间在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已经指出的那样,直接存储在会话中的映射对我来说是最简单和最理想的方式。我不会存储单个变量或整个域对象。而是将地图存储在会话中!或者自定义对象,该对象具有要在会话中存储的内容的属性。您可以使用会话范围的服务。您建议如何将存储在服务中的数据传递给视图?我编辑了我的答案以提供一个示例感谢您的详细解释。