在 Spring Boot 反应式 Web 应用程序上启用 SSL 并在控制台中对打印异常噪音进行 http 调用
Posted
技术标签:
【中文标题】在 Spring Boot 反应式 Web 应用程序上启用 SSL 并在控制台中对打印异常噪音进行 http 调用【英文标题】:Enabling SSL on spring boot reactive web application and making a http call to that printing an exception noise in console 【发布时间】:2019-03-02 21:35:58 【问题描述】:在我使我的 Spring Boot 反应式 Web 应用程序支持 SSL 后,当我尝试对服务器进行 http 调用时,它会在控制台中的异常跟踪下方打印。作为应用程序所有者,我无法阻止任何人使用我的服务。但是我应该能够防止在控制台中进行跟踪打印,尤其是在响应式 Web 应用程序中,IO 操作成本高昂。有什么办法可以防止这种情况发生吗?
编辑 3:
2018-10-01 14:11:18.440 ERROR 12457 --- [ctor-http-nio-2] r.i.n.channel.CloseableContextHandler : Handler failure while no child channelOperation was present
编辑 2:
IO 操作代价高昂 我刚刚意识到这可能发生在事件循环线程池之外。所以它可能不会阻塞任何线程。但我仍然想阻止它在控制台中打印。
编辑 1:
重现步骤
签出项目https://github.com/sp13ceg/spring-boot-reative-ssl 启动服务器./gradlew booRun
进行不安全的 https 调用 curl --insecure https://localhost:8080/hi
可以正常工作
进行 http 调用 curl http://localhost:8080/hi
您将在控制台中看到异常。
io.netty.handler.ssl.NotSslRecordException:不是SSL / TLS记录:474554202f686920485454502f312e310d0a486f73743a206c6f63616c686f73743a383434340d0a557365722d4167656e743a206375726c2f372e35342e300d0a4163636570743a202a2f2a0d0a0d0a 在 io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1178) [netty-handler-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1243) [netty-handler-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.29.Final.jar:4.1.29.Final] 在 java.lang.Thread.run(Thread.java:748)
【问题讨论】:
你能分享你应用的配置文件吗? server.port=8444 server.ssl.enabled=true server.ssl.key-store=serverCerts/server.jks server.ssl.key-store-password=password server.ssl.client- auth=WANT server.ssl.trust-store=serverCerts/ca.jks server.ssl.trust-store-password=password 您可以编辑您的问题以添加该信息吗?您是如何触发此异常消息的? 我已经用示例项目的链接编辑了问题。 【参考方案1】:我刚刚错过了日志跟踪中的重要内容。在原始堆栈跟踪之前有一行显示它来自哪里的日志的名称。请参阅编辑 3。
添加此属性将禁用此日志在控制台中打印。
logging.level.reactor.ipc.netty.channel.CloseableContextHandler=off
【讨论】:
以上是关于在 Spring Boot 反应式 Web 应用程序上启用 SSL 并在控制台中对打印异常噪音进行 http 调用的主要内容,如果未能解决你的问题,请参考以下文章
20191114 Spring Boot官方文档学习(4.7)
一次只有一个用户使用整个 Web 应用程序 - Spring Boot
在同一个 Spring Boot 应用程序中的 Rest 服务和 Web 服务