我有一个使用CXF
和Spring
的网络服务客户端。
客户端代理创建为春季管理@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客户端代理,它必须是线程安全的,因为多个用户可能同时发送请求。