Grails No thread-bound request found 错误?

Posted

技术标签:

【中文标题】Grails No thread-bound request found 错误?【英文标题】:Grails No thread-bound request found error? 【发布时间】:2021-11-13 08:58:46 【问题描述】:

按照 spring securty 和 saml 插件教程,我创建了一个简单的应用程序。

这是我创建简单的 hello world 应用所遵循的教程的链接。

http://grails-plugins.github.io/grails-spring-security-core/2.0.x/guide/tutorials.html

https://www.wave-access.com/public_en/blog/2014/june/23/how-we-configured-saml-20-on-grails.aspx

我终于可以配置 saml 插件了。

应用程序现在运行但抛出 500 运行时错误,如下所示。

我环顾了一段时间,没有找到任何有用的解决方案。该应用程序和插件都很旧,因为我必须使用 grails 2.2。

我正在使用 grails 2.2。

感谢任何有关导致此未发现线程绑定请求异常的原因的见解。

我已在 github 上发布代码供您参考

https://github.com/learningcscience/saml

谢谢!

|Loading Grails 2.2.0
No mavenInfo file found.
|Configuring classpath
.
|Environment set to development
.................................
|Packaging Grails application
....
|Compiling 1 source files
.............
|Running Grails application

Configuring Spring Security Core ...
... finished configuring Spring Security Core

Configuring Spring Security SAML ...
Registering metadata key: ping and value: security/idp-local.xml
...finished configuring Spring Security SAML
|Server running. Browse to http://localhost:8080/bookstore
Error |
2021-09-19 12:47:23,330 [http-bio-8080-exec-3] ERROR [/bookstore].[gsp]  - Servlet.service() for servlet [gsp] in context with path [/bookstore] threw exception
Message: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
    Line | Method
->> 1152 | runWorker in java.util.concurrent.ThreadPoolExecutor
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    622 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    748 | run . . . in java.lang.Thread

Error |
2021-09-19 12:47:24,146 [http-bio-8080-exec-2] ERROR [/bookstore].[default]  - Servlet.service() for servlet [default] in context with path [/bookstore] threw exception
Message: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
    Line | Method
->> 1152 | runWorker in java.util.concurrent.ThreadPoolExecutor
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    622 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    748 | run . . . in java.lang.Thread

【问题讨论】:

【参考方案1】:

快速查看您的配置后,您似乎尚未完成 SAML on GRAILS 教程的第 3 步:

3.密钥管理器设置

[....] 下载 sp.xml 并将其保存在 grails-app/conf/security/文件夹中。将我们在 OpenAM 服务器配置中生成的 ipd.xml 复制到同一文件夹中。在 Config.groovy 中添加 sp 和 idp 设置:
grails.plugins.springsecurity.saml.metadata.sp.file = 'security/sp.xml'
        grails.plugins.springsecurity.saml.metadata.providers = [idp: 'security/idp.xml']
        grails.plugins.springsecurity.saml.metadata.defaultIdp = 'idp'
        grails.plugins.springsecurity.saml.metadata.sp.defaults = [
            local: true,
            alias: 'localSp',
            securityProfile: 'metaiop',
            signingKey: 'apollo',
            encryptionKey: 'apollo',
            requireArtifactResolveSigned: true,
            requireLogoutRequestSigned: true,
            requireLogoutResponseSigned: true
        ]

请注意,教程中说“复制 ipd.xml”,这可能是一个错字。应该改为idp.xml 吗?

【讨论】:

顺便问一下,您是否有限制使用较新的 GRAILS 版本? (2.2.x 现在有点过时了)。不要误会我的意思,我自己还有几个 GRAILS 2.x 项目。只是想知道为什么不至少使用最新版本的 2.x 系列(即 GRAILS 2.5.6) 谢谢 rchfox。今天我试试你的建议。由于空间和资源的限制,现在我们被 grails 2.2 困住了。也没有时间进行升级,这需要很长时间。谢谢!很快就会更新。 好的,我刚刚添加了缺少的配置,但它仍然在抛出 2021-09-20 10:40:00,910 [http-bio-8080-exec-3] ERROR [/bookstore].[gsp] - servlet [gsp] 的 Servlet.service() 在路径 [/bookstore] 的上下文中抛出异常消息:未找到线程绑定请求:您是指实际 Web 请求之外的请求属性,还是处理外部请求最初接收线程? 顺便说一句,我故意留下缺少的步骤,因为在此之前它说运行应用程序。有一个 UI 可用作元数据控制器 localhost:8080/myApp/metadata)。而且网址无效。

以上是关于Grails No thread-bound request found 错误?的主要内容,如果未能解决你的问题,请参考以下文章

Grails 3.1.4 和 Docker - grails 命令返回“No profile found for name web”

grails-spring-security-oauth2-provider ClientCredentials filter no processing /oauth/token

Grails,SpringSecurity - 如果未记录,则禁用重定向

如何保护 Grails 中的所有 REST 请求和响应

Grails 唯一约束无法更新

Grails图像url加载但图像不加载?