2012-05-07 37 views
13

Tôi đang sử dụng Java để truy cập trang web HTTPS trả về hiển thị ở định dạng XML. Tôi chuyển thông tin xác thực đăng nhập vào chính URL đó. Đây là đoạn mã:Máy chủ trả lại mã phản hồi HTTP: 401 cho URL: https

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
requestURL = "https://Administrator:[email protected]:8443/abcd"; 

try { 
     InputStream is = null; 
     URL url = new URL(requestURL); 
     InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream(); 
     byte[] testByteArr = new byte[xmlInputStream.available()]; 
     xmlInputStream.read(testByteArr); 
     System.out.println(new String(testByteArr)); 
     Document doc = db.parse(xmlInputStream); 
     System.out.println("DOC="+doc); 
    } catch (MalformedURLException e) { 
    } 

Tôi đang tạo người quản lý tin cậy trong chương trình không xác thực chứng chỉ đã ký/chưa ký. Tuy nhiên, khi chạy chương trình trên, tôi nhận được lỗi Máy chủ trả lại mã phản hồi HTTP: 401 cho URL: https://Administrator:[email protected]:8443/abcd

Tôi có thể sử dụng cùng một url trên trình duyệt của mình và hiển thị xml chính xác. Vui lòng cho tôi biết cách thực hiện công việc này trong chương trình Java.

Trả lời

24

401 có nghĩa là "Không được ủy quyền", vì vậy phải có thông tin xác thực của bạn.

Tôi nghĩ rằng java URL không hỗ trợ cú pháp bạn đang hiển thị. Thay vào đó, bạn có thể sử dụng Authenticator.

Authenticator.setDefault(new Authenticator() { 

    @Override 
    protected PasswordAuthentication getPasswordAuthentication() {   
     return new PasswordAuthentication(login, password.toCharArray()); 
    } 
}); 

và sau đó chỉ cần gọi url thông thường, không có bằng chứng xác thực.

Các tùy chọn khác là cung cấp các thông tin trong một Header:

String loginPassword = login+ ":" + password; 
String encoded = new sun.misc.BASE64Encoder().encode (loginPassword.getBytes()); 
URLConnection conn = url.openConnection(); 
conn.setRequestProperty ("Authorization", "Basic " + encoded); 

PS: Nó không được khuyến cáo sử dụng Base64Encoder đó nhưng điều này chỉ là để cho thấy một giải pháp nhanh chóng. Nếu bạn muốn giữ lại giải pháp đó, hãy tìm một thư viện. Có nhiều.

+1

Cảm ơn Guillaume Polet. Lựa chọn thứ hai hoạt động như một sự quyến rũ. Tôi cần nó chỉ để thử nghiệm nội bộ, vì vậy tôi nghĩ rằng có thể là đủ. – Vish

+1

cảm ơn Polet. tùy chọn thứ hai đã giúp tôi. –

1

Hãy thử tính năng này. Bạn cần vượt qua xác thực để cho máy chủ biết người dùng hợp lệ của nó. Bạn cần phải nhập hai gói này và phải bao gồm một lọ jersy. Nếu bạn không muốn bao gồm jar Jersey sau đó nhập gói này

import sun.misc.BASE64Encoder; 

import com.sun.jersey.core.util.Base64; 
import sun.net.www.protocol.http.HttpURLConnection; 

và sau đó,

String encodedAuthorizedUser = getAuthantication("username", "password"); 
URL url = new URL("Your Valid Jira URL"); 
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
httpCon.setRequestProperty ("Authorization", "Basic " + encodedAuthorizedUser); 

public String getAuthantication(String username, String password) { 
    String auth = new String(Base64.encode(username + ":" + password)); 
    return auth; 
} 
Các vấn đề liên quan