如何将动态值传递给CXF OutInterceptor?

时间:2014-12-02 15:49:22

标签: java spring web-services soap cxf

我有一个使用CXFSpring的网络服务客户端。

客户端代理创建为春季管理@Bean,并注册到SpringBus

soap webservice需要一个名为“Auth = [pass]”的HTTP标头,而pass必须是一个动态值,对于使用该客户端的每个用户都是唯一的。

问题在于:我创建了一个AbstractOutDatabindingInterceptor,在将XML发送到Web服务之前放置了HTTP标头。

适用于硬编码传递。但我需要动态获取拦截器内的传递。因此,我会以某种方式将当前登录的用户INTO传递给拦截器本身。这样拦截器就可以获取正确的授权传递。

@Configuration
public class AppConfig {
    @Autowired
    SpringBus bus;

    @PostConstruct
    public void init() {
        bus.getOutInterceptors().add(new AbstractOutDatabindingInterceptor(Phase.MARSHAL) {
            @Override
            public void handleMessage(Message message) throws Fault {
               Map<String, List<String>> headers = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS);
               headers.put("Auth", Arrays.asList("dynamic pass per user"); //TODO how to get the current user dynamically?
            }
        });
    }   

    @Bean
    public WebservicePort getPort() {
        WebservicePort port = new Webservice(bus);
        return port;
    }
}



@Service
public class WebserviceClient {
    @Autowired
    private WebservicePort port;

    @Autowired
    private AuthService authService;

    public void run() {
        //construct the xmlRequest

        User user = authService.getCurrentUser();  
        port.send(xmlRequest); //invoke the auto-generated webservice stub
    }
}

当然我无法更改自动生成的方法签名send(xml)。 如何在动态发送时将当前用户置于OutInterceptor,并仅针对此发送请求?

对于cxf客户端代理,它必须是线程安全的,因为多个用户可能同时发送请求。

0 个答案:

没有答案