Получить Охот за сессию в командном объекте в Граалях
-
03-10-2019 - |
Вопрос
Как я могу получить сеанс в пределах командного объекта?
Я пытался:
import org.springframework.security.context.SecurityContextHolder as SCH
class MyCommand {
def session = RCH.currentRequestAttributes().getSession()
}
Это бросает
java.lang.illegalstateException: нет, связанный с нитей. Если вы на самом деле работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, работает за пределами DispatcherServlet / DispatcherPorttlet: в этом случае используйте RequestContextListener или RequestContextFilter, чтобы раскрыть текущий запрос.
Решение
У вас есть импорт для Security Security SecurityContexTholder, но вы используете стандартные Grails Holder Holder. Если вы используете плагин 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
}
}
Примечание.
Другие советы
Также возможно получить доступ к сеансу с использованием RequestExtholder (чтобы избежать зависимости / импорта / импорта пружины):
import org.springframework.web.context.request.RequestContextHolder as RCH
class MyCommand {
def someMethod() {
def session = RCH.requestAttributes.session
}
}
Другой путь:
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
HttpSession session = GrailsWebRequest.lookup().currentRequest.session
В моем приложении SecurityRequestHolder.request
Как-то возвращается NULL, но путь выше работает.