2009-04-01 19 views

Respuesta

24

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.

+5

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

6

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); 
+0

¿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

7

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()); 

} 
+0

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

+1

Veo 'Authenticator.setDefault' es estático pero también es un método sincronizado. ¿Realmente se requiere usar ThreadLocal? –

Cuestiones relacionadas