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

时间:2010-05-05 21:04:49

标签: spring grails command-objects

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

我试过了:

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

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

抛出

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

3 个答案:

答案 0 :(得分: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
   }
}

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

答案 1 :(得分:2)

也可以使用RequestContextHolder访问会话(以避免Spring Security依赖/导入):

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

答案 2 :(得分:1)

另一种方式:

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

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