2010-05-05 3 views
3

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

Я пробовал:

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

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

Это проливает

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

ответ

4

У вас есть импорт для 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-запроса.

+0

Спасибо, так мне нужно вызвать «someMethod()» из моего валидатора? – RyanLynch

+0

Нет, вы можете получить доступ к SRH.request.session внутри своего валидатора напрямую, так как он будет вызываться в контексте HTTP-запроса. Вы просто не можете определить его как поле. –

1

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

import org.springframework.web.context.request.RequestContextHolder as RCH 
class MyCommand { 
    def someMethod() { 
     def session = RCH.requestAttributes.session 
    } 
} 
1

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

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

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

+0

On grails 2.5.x | Ошибка java.lang.NullPointerException: не удается получить свойство currentRequest на нулевом объекте –