Java 如何将动态值传递给CXF OutiterCeptor?
我有一个使用Java 如何将动态值传递给CXF OutiterCeptor?,java,spring,web-services,soap,cxf,Java,Spring,Web Services,Soap,Cxf,我有一个使用CXF和Spring的webservice客户端 客户端代理被创建为spring管理的@Bean,并注册到SpringBus soap Web服务需要一个名为“Auth=[pass]”的HTTP头,而pass必须是一个动态值,对于使用客户端的每个用户都是唯一的 问题是:我创建了一个AbstractOutDatabindingInterceptor,它在将XML发送到Web服务之前放置HTTP头 这对硬编码通行证很好。但是我需要在拦截器内动态地获得通行证。因此,我必须以某种方式将当前登
CXF
和Spring
的webservice客户端
客户端代理被创建为spring管理的@Bean
,并注册到SpringBus
soap Web服务需要一个名为“Auth=[pass]”的HTTP头,而pass必须是一个动态值,对于使用客户端的每个用户都是唯一的
问题是:我创建了一个AbstractOutDatabindingInterceptor
,它在将XML发送到Web服务之前放置HTTP头
这对硬编码通行证很好。但是我需要在拦截器内动态地获得通行证。因此,我必须以某种方式将当前登录的用户传递到拦截器本身。这样拦截器就可以获取正确的授权通行证
@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
}
}
@配置
公共类AppConfig{
@自动连线
斯普林巴士;
@施工后
公共void init(){
bus.GetOutiterCeptors().add(新的AbstractOutDatabindingInterceptor(Phase.MARSHAL){
@凌驾
public void handleMessage(消息消息消息)引发错误{
映射头=(Map)message.get(message.PROTOCOL_头);
headers.put(“Auth”,Arrays.asList(“每个用户动态传递”);//如何动态获取当前用户?
}
});
}
@豆子
公共WebservicePort getPort(){
WebservicePort端口=新的Webservice(总线);
返回端口;
}
}
@服务
公共类WebserviceClient{
@自动连线
专用WebservicePort端口;
@自动连线
私人身份验证服务;
公开募捐{
//构造xmlRequest
User=authService.getCurrentUser();
port.send(xmlRequest);//调用自动生成的webservice存根
}
}
当然,我不能更改自动生成的方法签名send(xml)
。
在动态发送时,如何让当前用户进入OutInterceptor
,并且仅针对此发送请求
cxf客户端代理必须是线程安全的,因为多个用户可能会同时发送请求。从哪里获取用户名和密码?对于UI还是从DB?@KarthikPrasad重要吗?重要的是,user+pass是在发送xml请求之前注入的动态值,但不会造成干扰同时请求。为了回答您的问题:在我的应用程序中,我从UI获取用户名,并基于此从DB获取Web服务请求的pick user+pass凭据。用户名在这里用作某种类型的
@Id
。需要做同样的事。您找到解决方案了吗?