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

我试过了:

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.grail.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请求时请求

其他提示

也可以使用requestContexTholder访问会话(以避免弹簧安全依赖性/导入):

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 以某种方式返回无效,但是上面的方式有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top