3

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

我试过了:

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

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

这抛出

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

4

3 回答 3

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 请求期间访问会话和请求

于 2010-05-05T22:03:56.793 回答
2

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

import org.springframework.web.context.request.RequestContextHolder as RCH
class MyCommand {
   def someMethod() {
       def session = RCH.requestAttributes.session
   }
}
于 2013-11-16T00:43:18.220 回答
1

其他方式:

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

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

于 2014-09-16T19:01:43.053 回答