0

我需要访问当前会话的域类用户。以下代码有效:

class RatingController {    
def rate = {
    def rating = params.rating
    def artist = Artist.get( params.id )
    def user = User.get(1)
    user.addToRatings(new Rating(artist:artist, rating:rating))
    user.save()
    render(template: "/artist/rate", model: [artist: artist, rating: rating])
}
}

但是,我需要访问当前会话的用户,而不是显式获取 ID 等于 1 (User.get(1)) 的用户。我尝试了以下代码,但它不起作用:

class RatingController {    
def rate = {
    def rating = params.rating
    def artist = Artist.get( params.id )
    def user = user.session
    user.addToRatings(new Rating(artist:artist, rating:rating))
    user.save()
    render(template: "/artist/rate", model: [artist: artist, rating: rating])
}
}

我仍在努力完全理解 httpSession 概念,所以一点帮助会很棒。预先感谢。

更新

在我的 UserController 中,我的身份验证如下所示:

def authenticate = {
  def user = User.findByLoginAndPassword(params.login, params.password)
  if(user){
    session.user = user
    flash.message = "Hello ${user.name}!"
    redirect(controller:"event", action:"list")
  }else{
    flash.message = "Sorry, ${params.login}. Please try again."
    redirect(action:"create")
  }
}
4

3 回答 3

3

http 会话只不过是在来自单一来源(如浏览器)的一系列请求中维护的数据。

要在会话中添加一些内容,只需执行

session.setAttribute("key", value)

并从会话中获取数据只是做

session.getAttribute("key")

Grails 还为这里概述的会话访问添加了一些花哨的功能。他们的例子表明

def user = session["user"]
session["user"] = "John"
asset "John" == session.user

请注意,如果您使用 grails 插件进行身份验证和授权,它可能会提供一种获取用户的方法。例如 Spring Security 为您提供以下内容

springSecurityService.getCurrentUser()

根据插件的详细信息,该用户可能会或可能不会在会话中。

于 2011-06-24T15:48:53.887 回答
2

在你的代码中,我注意到你写了

def user = user.session

当我认为你的意思是

def user = session.user

我做的另一件事是让它 session.userId 即session.userId = user.id然后

def user = User.get(session.userId)

不确定这是否有必要。

于 2011-06-30T23:35:28.743 回答
1

您需要使用 .merge():

user.merge(flush: true)

这是因为当您将实例保存到 HttpSession 时,它与持久性上下文分离。这是来自 grails 的文档:http: //grails.org/doc/2.3.1/ref/Domain%20Classes/merge.html

于 2013-11-02T18:09:31.157 回答