Grails中的httpSession

时间:2011-06-24 15:41:41

标签: grails httpsession

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

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")
  }
}

3 个答案:

答案 0 :(得分:3)

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

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

session.setAttribute("key", value)

并从会话中获取数据

session.getAttribute("key")

Grails还为会话访问添加了一些好看,如here所示。他们的例子显示

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

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

springSecurityService.getCurrentUser()

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

答案 1 :(得分:2)

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

def user = user.session

我认为你的意思

def user = session.user

我做的另一件事是将它作为session.userId,即session.userId = user.id然后

def user = User.get(session.userId)

不确定是否有必要。

答案 2 :(得分:1)

您需要使用.merge():

user.merge(flush: true)

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