首页 > 解决方案 > 如何从 Keycloak Integration Spring Boot 向 APM 发送自定义请求或响应标头

问题描述

我正在开发 springboot 项目,我们正在使用 openId keycloak 进行身份验证。我也对多租户概念感到困惑。我想将自定义标头作为请求或响应发送,并且应该在 APM 中将其作为元数据捕获。我目前的做法如下:


public class PreAuthFilter extends KeycloakPreAuthActionsFilter {

@Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
((HttpServletResponse) response).addHeader("X-Realm",realm);
super.doFilter(request, response, chain);
}

但是使用上面的代码,我在 APM 中得到了多个响应元数据

http.response.headers.X-Realm.0

http.response.headers.X-Realm.1

http.response.headers.X-Realm.2

http.response.headers.X-Realm.3

我的期望是 APM 元数据中的单一领域

http.response.headers.X-Realm = "value"

我认为 SimpleHttpFacade 在多次解析部署期间被初始化,因此添加了响应。

需要建议

谢谢。

标签: spring-bootkeycloakmulti-tenantapm

解决方案


看来这可能是问题更可能与您的应用程序上下文弹簧和过滤器有关。

既然是春天,你可以试试OncePerRequestFilter吗?

import org.springframework.web.filter.OncePerRequestFilter;

@Named
public class ApmFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        // do apm things

        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }

}

推荐阅读