在Grails中获取命令对象的会话
-
03-10-2019 - |
题
如何从命令对象中获取会话?
我试过了:
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
以某种方式返回无效,但是上面的方式有效。
不隶属于 StackOverflow