在Grails中获取命令对象中的会话

Rya*_*nch 3 grails spring command-objects

如何从命令对象中获取会话?

我试过了:

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

class MyCommand {
   def session = RCH.currentRequestAttributes().getSession()
}
Run Code Online (Sandbox Code Playgroud)

这引发了

java.lang.IllegalStateException:找不到线程绑定请求:您是指实际Web请求之外的请求属性,还是处理最初接收线程之外的请求?如果您实际在Web请求中操作并仍然收到此消息,则您的代码可能在DispatcherServlet/DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter来公开当前请求.

Bur*_*ith 5

您有一个Spring Security的SecurityContextHolder导入,但您使用的是标准的Grails请求持有者.如果您正在使用Acegi插件,那么有一个过滤器可以在org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder管理的ThreadLocal中设置请求,因此这将起作用:

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

请注意,必须在方法中,因为命令类将在启动时实例化一次或多次以进行初始化,因此您只需在执行HTTP请求期间访问会话和请求