You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring(Wicket)应用使用KeycloakOIDCFilter时跨应用登出无法即时失效会话的问题排查与解决

跨应用登出时Spring(Wicket)应用未即时失效的解决方案

我前段时间碰到过和你完全一致的问题!一开始也以为是自己的Spring(Wicket)应用(对应你的ApplicationA)配置有问题,折腾了好久代码和Keycloak过滤器设置,结果最后发现问题根源在Keycloak认证服务端(你的AuthenticationApplication)那边。

问题回顾

你这边的场景是:

  • ApplicationA基于Spring+Wicket,用keycloak-servlet-filter-adapter和keycloak-authz-client对接Keycloak认证
  • ApplicationB/C用React Keycloak组件,从ApplicationA登出时B/C能同步登出,但反过来从B/C登出后,ApplicationA的会话不会立即失效,要等超时才会跳转到登录页
  • 需求是:从其他应用登出后,访问/刷新ApplicationA的任意页面时,会话立即失效并跳转到AuthenticationApplication的登录页

排查结论与解决方法

根本问题是AuthenticationApplication无法定位到ApplicationA,导致Keycloak没法主动给ApplicationA发送登出通知请求(也就是/k_logout接口调用)。

解决步骤超级简单,不需要修改ApplicationA的任何代码或配置:

  1. 找到AuthenticationApplication所在服务器的/etc/hosts文件
  2. 添加ApplicationA的域名与IP地址的映射,比如:
    192.168.1.100  applicationa.yourdomain.com
    
  3. 保存文件后,重启AuthenticationApplication(或者等待DNS缓存生效)

做完这一步后,你再从ApplicationB/C登出账号,然后刷新ApplicationA的页面,就会立即跳转到AuthenticationApplication的登录页,会话即时失效——完全符合你的需求!

确认原配置有效性

你之前的配置其实完全没问题,这里再帮你确认下:

  • pom.xml依赖:keycloak-servlet-filter-adapter和keycloak-authz-client的版本(10.0.2)适配你的场景
  • web.xml过滤器配置:KeycloakOIDCFilter拦截所有请求的设置是正确的
  • 获取Token的代码:通过RefreshableKeycloakSecurityContext获取Token的逻辑也没问题,之前之所以在其他应用登出后还能拿到Token,就是因为Keycloak没通知ApplicationA失效会话

内容的提问来源于stack exchange,提问作者Borgy Manotoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:32:48