如何从命令对象中获取会话?
我试过了:
import org.springframework.security.context.SecurityContextHolder as SCH
class MyCommand {
def session = RCH.currentRequestAttributes().getSession()
}
抛出
java.lang.IllegalStateException:找不到线程绑定请求:您是指实际Web请求之外的请求属性,还是处理最初接收线程之外的请求?如果您实际上是在Web请求中操作并仍然收到此消息,则您的代码可能在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter来公开当前请求。
答案 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,但上面的方法有效。