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

Spring 获取Grails中命令对象中的会话,spring,grails,command-objects,Spring,Grails,Command Objects,如何从命令对象中获取会话 我试过: import org.springframework.security.context.SecurityContextHolder as SCH class MyCommand { def session = RCH.currentRequestAttributes().getSession() } 这个扔 java.lang.IllegalStateException:未找到线程绑定请求:您是指实际web请求之外的请求属性,还是在原始接收线程之外处

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

我试过:

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

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


java.lang.IllegalStateException:未找到线程绑定请求:您是指实际web请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上在web请求中操作,并且仍然收到此消息,那么您的代码可能在DispatcherServlet/DispatcherPortlet之外运行:在本例中,使用RequestContextListener或RequestContextFilter公开当前请求。

您已经导入了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
   }
}

请注意,is必须位于方法中,因为命令类将在启动时实例化一次或多次以进行初始化,因此您只需要在HTTP请求执行期间访问会话和请求,也可以使用RequestContextHolder访问会话(以避免Spring安全依赖项/导入):

另一种方式:

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

在我的应用程序中,
SecurityRequestHolder.request
以某种方式返回null,但上面的方法是有效的。

谢谢,那么我需要从我的验证器中调用“someMethod()”吗?不,你可以直接在验证器中访问SRH.request.session,因为它将在http请求的上下文中调用。您不能将其定义为字段。在grails 2.5.x上| Error java.lang.NullPointerException:无法在null对象上获取属性“currentRequest”。在尝试访问自定义验证器内的会话时,此解决方案对我有效
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
HttpSession session = GrailsWebRequest.lookup().currentRequest.session