2009-04-01 6 views
15

Tôi đã cố gắng làm cho nó hoạt động bằng cách sử dụng CXF User Guide, nhưng tôi đã không có may mắn.Làm cách nào để sử dụng dịch vụ web được bảo vệ bằng xác thực cơ sở HTTP bằng khung công tác CXF?

Tôi đang cố gắng gọi dịch vụ web bằng mã java.

+0

Liên kết này giúp tôi giải quyết vấn đề cùng http://www.brimllc.com/2011/04/apache-cxf-client-setting-http-request-header-for-basic-authentication/comment -page-1/# comment-4313 –

Trả lời

24

Điều này được đề cập trong Đặc tả JAX-WS. Về cơ bản, đặt tên người dùng/mật khẩu làm thuộc tính trên ngữ cảnh yêu cầu:

((BindingProvider)proxy).getRequestContext().put(
    BindingProvider.USERNAME_PROPERTY, "joe"); 
((BindingProvider)proxy).getRequestContext().put(
    BindingProvider.PASSWORD_PROPERTY, "pswd"); 

Thời gian chạy đặt chúng vào tiêu đề HTTP.

+5

Có thể đáng nói đến là bạn chỉ cần truyền cổng CXF: Cổng BindingProvider portBP = (BindingProvider); portBP.getRequestContext() .đặt (BindingProvider.USERNAME_PROPERTY, "tên người dùng"); portBP.getRequestContext() .đặt (BindingProvider.PASSWORD_PROPERTY, "mật khẩu"); – Francois

6

Có một cách tốt hơn:

khi tạo Java từ WSDL, thêm tùy chọn "-exsh true":

WSDL2Java -exsh đúng -p edu.sharif.ce http://wsdl.ir/WebServices/WebService.asmx?WSDL

và thêm UserCredential khi sử dụng:

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

Bạn có chắc chắn điều này sẽ bật Xác thực cơ bản trong tiêu đề yêu cầu HTTP không? Điều này có thể sẽ đặt thông tin xác thực bên trong thông báo SOAP thay vì đặt tiêu đề HTTP ủy quyền ... (như tài liệu nói điều này hoạt động trên 'tiêu đề xà phòng ngầm') – Geert

7

Bạn có thể cung cấp Authenticator của riêng bạn. Bằng cách đó, nó sẽ hoạt động nếu bản thân WDSL được bảo vệ bằng xác thực HTTP cơ bản.

@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

Lưu ý rằng phương thức 'Authenticator.setDefault (Authenticator)' là tĩnh và do đó sẽ áp dụng cho tất cả các chủ đề của bạn. Tuy nhiên, thật dễ dàng để giải quyết vấn đề này bằng cách sử dụng biến 'ThreadLocal' để lưu thông tin xác thực khác nhau cho mỗi luồng. – Marco

+1

Tôi thấy 'Authenticator.setDefault' là tĩnh nhưng nó cũng là một phương thức được đồng bộ hóa. Liệu nó thực sự cần thiết để sử dụng ThreadLocal? –