Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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 Apache CXF-未从WSS4JOutInterceptor发送凭据?_Java_Web Services_Cxf_Ws Security - Fatal编程技术网

Java Apache CXF-未从WSS4JOutInterceptor发送凭据?

Java Apache CXF-未从WSS4JOutInterceptor发送凭据?,java,web-services,cxf,ws-security,Java,Web Services,Cxf,Ws Security,我正在尝试使用WS-Security UsernameToken规范1.0连接到web服务, 使用ApacheCXF2.4.0 我已经从CXF文档中复制了下面的代码,但是我得到了:org.apache.CXF.ws.policy.PolicyException:没有可用的用户名 MyService_Service ss = new MyService_Service(wsdlURL, SERVICE_NAME); MyService port = ss.getBasicHttpB

我正在尝试使用WS-Security UsernameToken规范1.0连接到web服务, 使用ApacheCXF2.4.0

我已经从CXF文档中复制了下面的代码,但是我得到了:org.apache.CXF.ws.policy.PolicyException:没有可用的用户名

    MyService_Service ss = new MyService_Service(wsdlURL, SERVICE_NAME);
    MyService port = ss.getBasicHttpBindingMyService ();  


    Client client = ClientProxy.getClient(port);
    Endpoint cxfEndpoint = client.getEndpoint();

    Map<String,Object> outProps = new HashMap<String,Object>();
    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    outProps.put(WSHandlerConstants.USER, "USERNAME");
    outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, 
    ClientPasswordHandler.class.getName());

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
    cxfEndpoint.getOutInterceptors().add(wssOut);

有没有办法查看是否应用了WSS4Jinterceptor,是否发送了UsernameToken?

您是否在客户端获得了PolicyException?如果是这样,这可能意味着您正在使用的WSDL中有一个WS-SecurityPolicy片段,该片段描述了它想要和期望的UsernameToken策略。如果是这种情况,那么您根本不应该配置WSS4JOutInterceptor。WS-Policy运行时将处理它,您只需要提供它可能需要的一些属性

SecurityPolicy内容的文档位于:

您可能只需要使用:


Map ctx = ((BindingProvider)port).getRequestContext();
ctx.put("ws-security.username", "USERNAME");
ctx.put("ws-security.password", "Password");

在使用丹尼尔的答案时,我得到了以下例外

Caused by: org.apache.cxf.transport.http.HTTPException: HTTP response '401: Unauthorized' when communicating with http://..
at .apache.cxf.inorg.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1555)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1494)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1402)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:649)
at orgterceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:535)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:465)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:368)
我用了下面的,它开始工作

Map ctx = ((BindingProvider) ssPort).getRequestContext();
        ctx.put(BindingProvider.USERNAME_PROPERTY, "user");
        ctx.put(BindingProvider.PASSWORD_PROPERTY, "pass");
        ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://c

感谢Daniel,我的完整工作配置如下:

    webServicePort = webService_service.getPort(WebService.class);

    Client client = ClientProxy.getClient(webServicePort);

    Endpoint cxfEndpoint = client.getEndpoint();

    Map<String, Object> props = ((BindingProvider) webServicePort).getRequestContext();
    props.put("ws-security.username", PravoRuConstants.USERNAME);
    props.put("ws-security.password", PravoRuConstants.PASSWORD);

    props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    props.put(WSHandlerConstants.USER, PravoRuConstants.USERNAME);
    props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);

    props.put(WSHandlerConstants.PW_CALLBACK_CLASS, PravoRuPasswordHandler.class.getName());

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
    cxfEndpoint.getOutInterceptors().add(wssOut);
webServicePort=webService\u service.getPort(webService.class);
Client Client=ClientProxy.getClient(webServicePort);
端点cxfEndpoint=client.getEndpoint();
Map props=((BindingProvider)webServicePort.getRequestContext();
props.put(“ws-security.username”,PravoRuConstants.username);
props.put(“ws-security.password”,PravoRuConstants.password);
put(WSHandlerConstants.ACTION、WSHandlerConstants.USERNAME\u令牌);
put(WSHandlerConstants.USER,PravoRuConstants.USERNAME);
put(WSHandlerConstants.PASSWORD\u类型,WSConstants.PW\u文本);
put(WSHandlerConstants.PW_CALLBACK_类,PravoRuPasswordHandler.CLASS.getName());
WSS4JOutInterceptor wssOut=新WSS4JOutInterceptor(道具);
cxfEndpoint.getOutiterCeptors().add(wssOut);

你的答案对我不合适。我看到了控制台,例外是:General Web Service security exception Tanks Daniel。我已经找了好几个小时了。丹尼尔,可能太旧了。但是,我需要知道,如果我喜欢我的密码类型是文本,并且想要添加nonce,我在这里怎么做?您的配置也适用于我,只是有一点点不同。我不必将拦截器添加到端点输出拦截器(代码段的最后一行),否则我会在请求中打印两次username\u令牌头。
    webServicePort = webService_service.getPort(WebService.class);

    Client client = ClientProxy.getClient(webServicePort);

    Endpoint cxfEndpoint = client.getEndpoint();

    Map<String, Object> props = ((BindingProvider) webServicePort).getRequestContext();
    props.put("ws-security.username", PravoRuConstants.USERNAME);
    props.put("ws-security.password", PravoRuConstants.PASSWORD);

    props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    props.put(WSHandlerConstants.USER, PravoRuConstants.USERNAME);
    props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);

    props.put(WSHandlerConstants.PW_CALLBACK_CLASS, PravoRuPasswordHandler.class.getName());

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
    cxfEndpoint.getOutInterceptors().add(wssOut);