Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将动态值传递给CXF OutiterCeptor?_Java_Spring_Web Services_Soap_Cxf - Fatal编程技术网

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
。需要做同样的事。您找到解决方案了吗?