【问题标题】:Spring Global ClientInterceptorSpring 全局客户端拦截器
【发布时间】:2019-11-19 04:25:51
【问题描述】:

我有一个使用大量客户服务的遗留应用程序。最近,需要为每个请求添加一个自定义的 http 安全标头。一种方法是为每个 WebServiceTemplate 添加一个 ClientInterceptor,但我觉得它有点重复代码。有没有办法应用全局 ClientInterceptor ?

正如我所说,这是一个仍然建立在 Spring Fw 3.2.2.RELEASE 和 spring-ws 2.0.6-RELEASE 之上的遗留系统

【问题讨论】:

    标签: spring spring-integration spring-ws


    【解决方案1】:

    你可以实现一个通用的ClientInterceptor,像这样:

    public class AddCustomSecurityHeader implements ClientInterceptor {
    
        @Override
        public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
           TransportContext context = TransportContextHolder.getTransportContext();
           HttpComponentsConnection connection =(HttpComponentsConnection) context.getConnection();
           connection.addRequestHeader("custom-security-header", "lorem ipsum");
    
           return true;
        }
    }
    

    然后你声明一个@Bean 类型为WebServiceTemplate

    @Bean
    public WebServiceTemplate webServiceTemplate() {
        WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
        // add your current configuration here
    
        ClientInterceptor[] interceptors = {new AddCustomSecurityHeader()};
        webServiceTemplate.setInterceptors(interceptors);
        return webServiceTemplate;
    }
    

    希望对你有帮助!

    【讨论】:

    • 感谢您的评论。为什么需要为拦截器注入 WebServiceTemplate ?考虑到我会将此模板用于不同的服务;我将不得不使用不同的编组器/解组器配置创建不同的模板,这在某些时候与我试图不重复配置的事情相同。
    • 输入错误:)
    • 我的错误,我刚刚注意到您需要一个安全标头,我认为它是授权标头是否正确?
    • 正确。这是一个自定义安全标头。不是标准的身份验证,但仍然是 http 标头。您的评论也让我感到震惊:) 我将扩展 wstemplate 以在空拦截器列表中预定义自定义拦截器。这应该有效。 ----编辑----这是一种反模式并且难以维护的情况。我可能会认为遵循我认为的标准方式。
    • 完成了,也许现在更有帮助了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2020-06-29
    • 2014-11-27
    • 2019-09-05
    • 1970-01-01
    • 2020-01-21
    相关资源
    最近更新 更多