【问题标题】:Get ahold of session in command object in Grails在 Grails 的命令对象中获取会话
【发布时间】:2011-02-16 03:12:15
【问题描述】:

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

我试过了:

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 grails command-objects


    【解决方案1】:

    您有一个 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请求执行期间访问会话和请求

    【讨论】:

    • 谢谢,我需要在验证器中调用“someMethod()”吗?
    • 不,您可以直接在验证器中访问 SRH.request.session,因为它将在 http 请求的上下文中调用。您只是不能将其定义为字段。
    【解决方案2】:

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

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

    【讨论】:

    • 当我尝试在自定义验证器中访问会话时,此解决方案适用于我
    【解决方案3】:

    另一种方式:

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

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

    【讨论】:

    • 在 grails 2.5.x 上 |错误 java.lang.NullPointerException:无法在空对象上获取属性“currentRequest”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多