Traté de hacerlo funcionar usando el CXF User Guide, pero no he tenido suerte.¿Cómo consumo un servicio web protegido con autenticación básica HTTP utilizando el marco CXF?
Estoy tratando de llamar al servicio web usando el código de java.
Traté de hacerlo funcionar usando el CXF User Guide, pero no he tenido suerte.¿Cómo consumo un servicio web protegido con autenticación básica HTTP utilizando el marco CXF?
Estoy tratando de llamar al servicio web usando el código de java.
Esto está cubierto por la Especificación JAX-WS. Básicamente, establecer el nombre de usuario/contraseña como propiedades en el contexto de la petición:
((BindingProvider)proxy).getRequestContext().put(
BindingProvider.USERNAME_PROPERTY, "joe");
((BindingProvider)proxy).getRequestContext().put(
BindingProvider.PASSWORD_PROPERTY, "pswd");
El tiempo de ejecución de los pone en la cabecera HTTP.
Podría valer la pena mencionar que solo necesita lanzar el puerto CXF: BindingProvider portBP = (BindingProvider) port; portBP.getRequestContext(). Put (BindingProvider.USERNAME_PROPERTY, "username"); portBP.getRequestContext(). Put (BindingProvider.PASSWORD_PROPERTY, "contraseña"); – Francois
Hay una manera mucho mejor:
cuando se genera a partir de WSDL Java, la opción de añadir "-exsh verdadero":
wsdl2java -exsh cierto edu.sharif.ce -p http://wsdl.ir/WebServices/WebService.asmx?WSDL
y agregue UserCredential al usar:
UserCredentials user = new UserCredentials();
user.setUserid("user");
user.setPassword("pass");
ResearchWebService_Service service = new ResearchWebService_Service();
ResearchWebService port = service.getResearchWebService();
port.addNewProject(newProject, user);
¿Estás seguro de que esto habilitará la autenticación básica en los encabezados de solicitud HTTP? Esto probablemente establezca las credenciales dentro del mensaje SOAP en lugar de establecer un encabezado HTTP de Autorización ... (como dicen los documentos esto opera en 'encabezados implícitos') – Geert
Puede proporcionar su propio Autenticador. De esa forma funcionará si WDSL está protegido por autenticación HTTP básica.
@WebServiceRef(wsdlLocation = "https://laka/sito?wsdl")
static XxxService service;
public static void main(String[] args) {
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user", "password".toCharArray());
}
});
service = new XxxService();
Xxx port = service.getXxxPort();
// invoke webservice and print response
XxxResponse resp = port.foo();
System.out.println(resp.toString());
}
Tenga en cuenta que el método 'Authenticator.setDefault (Authenticator)' es estático y por lo tanto, se aplicará a todos sus hilos. Sin embargo, es bastante fácil evitar esto mediante el uso de una variable 'ThreadLocal' para guardar información de autenticación diferente por subproceso. – Marco
Veo 'Authenticator.setDefault' es estático pero también es un método sincronizado. ¿Realmente se requiere usar ThreadLocal? –
Este enlace me ayudó a resolver el mismo problema http://www.brimllc.com/2011/04/apache-cxf-client-setting-http-request-header-for-basic-authentication/comment -page-1/# comment-4313 –