【问题标题】:How to removing response header with a RestFilter如何使用 RestFilter 删除响应标头
【发布时间】:2020-03-10 12:59:02
【问题描述】:

是否可以删除带有RestFilter 的响应标头?看着这个cookbook,你会说这应该是可能的。但是,过滤器仅在请求传入时调用,在调用资源类之前。我希望有一个钩子,我可以在其中修改响应标头,然后再将其发送回客户端。

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

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

【问题讨论】:

    标签: rest intershop


    【解决方案1】:

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

    所以你可以创建一个 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");
        }
    }
    

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

    【讨论】:

    • 太棒了!它就像一个魅力。我有一些更正。代码应该实现 ContainerResponseFilter,而不是 ContainerRequestFilter。 response.getHeaders().remove 不起作用。您需要使用以下方法获取标头:Request.getCurrent().getObject("HTTPHeaders")。我认为这是 intershop 的事情,但不是球衣的事情。 CorsFilter 也是这样做的。
    • 威廉。你当然是对的。我没有测试我的代码,只是想指出您可以影响 (jax-rs) 应用程序的类集并实际注册您选择的每个 jax-rs 工件。也应该可以使用这种方式提供资源,但我不确定这是否是一个好主意。如果您处理自己的资源,则不再需要使用组件文件,但也可以使用 guice。
    猜你喜欢
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2018-06-11
    • 2012-06-24
    • 1970-01-01
    • 2013-06-02
    • 2014-10-16
    相关资源
    最近更新 更多