java - 带有 Keycloak 和 Play 框架的 SocketTimeoutException
问题描述
我正在开发一个游戏!使用 Keycloak 进行身份验证的应用程序。我正在将我的 Keycloak 实例从一台服务器移动到另一台服务器(比如服务器 A 到服务器 B)。在服务器 A 上使用 Keycloak 一切正常,但在服务器 B 上使用 Keycloak 时,每次尝试连接到应用程序时都会出现以下错误:
play.api.UnexpectedException: Unexpected exception[RuntimeException: org.pac4j.core.exception.TechnicalException:
java.net.SocketTimeoutException: connect timed out]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:247)
at play.api.http.HttpErrorHandlerExceptions.throwableToUsefulException(HttpErrorHandler.scala)
at play.http.DefaultHttpErrorHandler.throwableToUsefulException(DefaultHttpErrorHandler.java:204)
at play.http.DefaultHttpErrorHandler.onServerError(DefaultHttpErrorHandler.java:164)
at play.core.j.JavaHttpErrorHandlerAdapter.$anonfun$onServerError$1(JavaHttpErrorHandlerAdapter.scala:22)
at play.core.j.JavaHelpers.$anonfun$invokeWithContext$1(JavaHelpers.scala:273)
at play.core.j.JavaHelpers.withContext(JavaHelpers.scala:284)
at play.core.j.JavaHelpers.withContext$(JavaHelpers.scala:280)
at play.core.j.JavaHelpers$.withContext(JavaHelpers.scala:293)
at play.core.j.JavaHelpers.invokeWithContext(JavaHelpers.scala:272)
有趣的是,当我在开发模式下本地启动应用程序时,一切正常,但是,当我在开发模式下(在服务器 B 上)启动应用程序时发生错误。
我在网上找不到与此问题相关的任何内容。有没有人遇到过
我正在使用 Keycloak 6.0.1
解决方案
事实证明,问题来自我服务器上 Java 的 TimeZone 配置。它与系统的 TimeZone 不同(顺便说一下,这也是 Keycloak 的时区)。
这种时区差异在来自客户端的请求和来自服务器的响应之间造成了人为的延迟,导致它认为套接字已经等待了一个小时(或更长时间,取决于时区之间的差距) .
我找到的解决方案是在启动我的应用程序时将 TimeZone 参数设置为系统的时区,方法-Duser.timezone=CET
是在JAVA_OPTS
.