如何使用 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。
是否可以删除带有 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。