如何使用 RestFilter 删除响应 header

How to removing response header with a RestFilter

是否可以删除带有 RestFilter 的响应 header?看着这个 cookbook 你会说这应该是可能的。但是,过滤器仅在请求传入时调用,在调用资源 class 之前。我期待有一个钩子,我可以在将响应发送回客户端之前修改响应 headers。

我以 CORSFilter 为例,但它只设置 headers,而不是删除它们。

更具体地说,我想在 session 过期时删除 Auth 提供商设置的 WWW-Authenticate header。此 header 会导致浏览器 (chrome) 中出现一个不受欢迎的弹出窗口。

你需要的是 javax.ws.rs.container.ContainerRequestFilter。在 jax-rs 中,此类过滤器可以在 javax.ws.rs.core.Application 中注册。 ICM 中使用的应用程序是 com.intershop.component.rest.internal.application.DefaultRestApplication,可以使用 com.intershop.component.rest.internal.application.ApplicationClassesProvider 进行调整,可以使用 Set-Binding.

进行注册

因此您可以创建一个 Guice-Module 和您的过滤器:

public class MyRestModule extends AbstractModule
{
    @Override
    protected void configure()
    {
        Multibinder<ApplicationClassesProvider> binder = Multibinder.newSetBinder(binder(),
                        ApplicationClassesProvider.class);
                    binder.addBinding().toInstance(c->c.accept(MyResponseFilter.class));
    }
}

public class MyResponseFilter extends ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext request, ContainerResponseContext response)
    {
        response.getHeaders().remove("WWW-Authenticate");
    }
}

请注意,此过滤器将应用于所有请求,因此请确保仅针对您真正关心的请求删除 headers。