当前位置:  开发笔记 > 编程语言 > 正文

从过滤器访问"会话"

如何解决《从过滤器访问"会话"》经验,为你挑选了1个好方法。

我正在使用grails 2.5.x并添加一些PreAuthenticationspring-security.

我正在尝试将请求参数传送到PreAuth包中,因此我创建了一个执行它的过滤器.这是班级:

class PreAuthenticationRequestParametersFilter extends AbstractPreAuthenticatedProcessingFilter {

这是引导程序:

def init = { servletContext ->
    // injects request data for SAML login
    SpringSecurityUtils.clientRegisterFilter('preAuthRequestFilter', SecurityFilterPosition.PRE_AUTH_FILTER)
}

最后,这是我的bean配置来自resources.groovy:

preAuthRequestFilter(PreAuthenticationRequestParametersFilter) {
    authenticationManager = ref("authenticationManager")
}

我想从过滤器中进行一些数据库查找.但是,当我尝试使用我的DAO(Hibernate)方法时,它正在bar.

org.springframework.dao.DataAccessResourceFailureException: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread
    org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:105)
    com.mydomain.PreAuthenticationRequestParametersFilter.decodeXml(PreAuthenticationRequestParametersFilter.groovy:52)

我尝试session = ref("session")在我的过滤器中添加" " resources.groovy.那编译失败了.

有没有办法在这个级别访问我的会话/ DAO?



1> Burt Beckwit..:

这是Hibernate会话,而不是HTTP会话.Grails使用OpenSessionInView模式,它打开Hibernate会话并在请求完成之前保持可用,但Spring Security在Grails之前运行(如果它需要阻止访问),所以没有会话自动注册.

最简单的解决方法是将代码包装在一个withTransaction块中.无论如何,如果您要写入数据库,这也是一个好主意,但也避免了您所看到的问题,并且还允许延迟加载工作.您调用的域类withTransaction没有影响,因此选择任何一个,例如

AnyDomainClass.withTransaction { status ->

  // GORM code here
}

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有