2009-03-01 19 views
14

Tôi đang xây dựng một plugin Eclipse nói chuyện với giao diện REST sử dụng Xác thực cơ bản. Khi xác thực không thành công, tôi muốn bật hộp thoại cài đặt của plugin và thử lại. Thông thường tôi có thể sử dụng static Authenticator.setDefault() để thiết lập một trình xác thực cho tất cả các HttpURLConnection cho điều này, nhưng vì tôi đang viết một plugin tôi không muốn ghi đè lên mặc định của Eclipse Authenticator (org.eclipse.ui.internal.net.auth);Java Authenticator trên cơ sở mỗi kết nối?

Tôi đã nghĩ đến việc đặt tùy chỉnh Authenticator trước khi tải và đặt lại mặc định của Eclipse, nhưng tôi cho rằng điều này sẽ gây ra tất cả các vấn đề chủng tộc với đa luồng, vì vậy tôi nhanh chóng mất khái niệm đó.

tìm kiếm của Google mang lại tất cả các loại kết quả về cơ bản nói với tôi đó là không thể:

Java URLConnection API phải có setAuthenticator (Authenticator) phương pháp để làm cho nó dễ dàng hơn để sử dụng lớp này trong bối cảnh đa luồng nơi xác thực là bắt buộc.

Source

Nếu ứng dụng chứa vài plugin của bên thứ ba và mỗi plugin sử dụng Authenticator riêng gì chúng ta nên làm gì? Mỗi lời gọi của phương pháp "Authenticator.setDefault()" trước Rewrite định nghĩa Authenticator ...

Source

Có bất kỳ phương pháp khác nhau có thể giúp tôi vượt qua vấn đề này?

+0

+1 Tôi có cùng một vấn đề. Rất phiền phức! –

Trả lời

8

Nếu không thể với HttpURLConnection, tôi khuyên bạn nên sử dụng thư viện httpclient từ Apache.

Một ví dụ nhanh:

HttpClient client = new HttpClient(); 
client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("test","test")); 
GetMethod getMethod = new GetMethod("http://www.example.com/mylogin"); 
client.executeMethod(getMethod); 
System.out.println(getMethod.getResponseBodyAsString()); 
+0

vâng apache commoms http khách hàng là những gì tôi đã giải quyết về cách sử dụng nếu vấn đề này với HttpURLConnection mặc định JRE là onovercomeable. Cảm ơn vì câu trả lời! –

+0

Cuối cùng, chọn lớp Http của bên thứ ba là giải pháp khả thi duy nhất, vì vậy tôi sẽ chấp nhận câu trả lời của bạn. –

1

cách tiếp cận khác sẽ được thực hiện chứng thực cơ bản cho mình về kết nối.

final byte[] encodedBytes = Base64.encodeData((username + ':' + new String(password)).getBytes("iso-8859-1")); 
    final String encoded = new String(encodedBytes, "iso-8859-1"); 

    connection.setRequestProperty("Authorization", "Basic " + encoded); 

Điều này cũng sẽ không có yêu cầu chưa được xác thực để nhận 401 trước khi cung cấp thông tin xác thực về yêu cầu tiếp theo. Hành vi tương tự có thể được tận dụng trong ứng dụng khách http apache bằng cách yêu cầu xác thực trước.

Các vấn đề liên quan