Получить сессию в командном объекте в Grails - PullRequest
3 голосов
/ 06 мая 2010

Как я могу получить сеанс из объекта команды?

Я пробовал:

import org.springframework.security.context.SecurityContextHolder as SCH

class MyCommand {
   def session = RCH.currentRequestAttributes().getSession()
}

Это выдает

java.lang.IllegalStateException: Нет потокаобнаружен связанный запрос: Вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне первоначально принимающего потока?Если вы действительно работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet / DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter, чтобы отобразить текущий запрос.

Ответы [ 3 ]

5 голосов
/ 06 мая 2010

У вас есть импорт для SecurityContextHolder в Spring Security, но вы используете стандартный держатель запросов Grails. Если вы используете плагин Acegi, то есть фильтр, который устанавливает запрос в ThreadLocal под управлением org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder, так что это будет работать:

import org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder as SRH
class MyCommand {
   def someMethod() {
      def session = SRH.request.session
   }
}

Обратите внимание, что это должно быть в методе, так как класс команд будет создан один или несколько раз при запуске для инициализации, поэтому вам необходимо получить доступ к сеансу и запросу только во время выполнения HTTP-запроса

2 голосов
/ 16 ноября 2013

Также возможно получить доступ к сеансу, используя RequestContextHolder (чтобы избежать зависимости / импорта Spring Security):

import org.springframework.web.context.request.RequestContextHolder as RCH
class MyCommand {
   def someMethod() {
       def session = RCH.requestAttributes.session
   }
}
1 голос
/ 16 сентября 2014

Другой способ:

import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
HttpSession session = GrailsWebRequest.lookup().currentRequest.session

В моем приложении SecurityRequestHolder.request как-то возвращает ноль, но способ выше работает.

...