Получить Охот за сессию в командном объекте в Граалях

StackOverflow https://stackoverflow.com/questions/2776770

  •  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, но путь выше работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top