httpSession в Grails - PullRequest
       16

httpSession в Grails

0 голосов
/ 24 июня 2011

Мне нужен доступ к классу домена 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])
}
}

Но вместо того, чтобы явно получить пользователя с идентификатором, равным 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, поэтому небольшая помощь была бы полезна. Спасибо заранее.

UPDATE

В моем 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 ]

3 голосов
/ 24 июня 2011

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()

в зависимости от деталей вашего плагина, этот пользователь может или не может быть в сеансе.

2 голосов
/ 01 июля 2011

В вашем коде я заметил, что вы написали

def user = user.session

Когда я думаю, что вы имеете в виду

def user = session.user

Другая вещь, которую я делаю, это делает session.userId, т.е. session.userId = user.id, а затем

def user = User.get(session.userId)

Не уверен, если это необходимо.

1 голос
/ 02 ноября 2013

Вам нужно будет использовать .merge ():

user.merge(flush: true)

Это потому, что экземпляр отсоединяется от контекста постоянства при сохранении его в HttpSession.Вот документ из Грааля: http://grails.org/doc/2.3.1/ref/Domain%20Classes/merge.html

...