2011-12-29 45 views
6

Tôi có một ứng dụng web Java, chạy trong Tomcat 6, tải nguồn cấp dữ liệu RSS từ các URL từ xa.Xác thực proxy Java

Tôi sử dụng Rome để xử lý nguồn cấp dữ liệu RSS và các định dạng khác nhau cho tôi. Phần kết nối trông giống như sau:

try{ 
    feedSource = new URL(rssObject.getAsset()); 
}catch(MalformedURLException mue){ 
    logger.error(...); 
    throw mue; 
} 

try{ 
    URLConnection connection = feedSource.openConnection(); 
    feed = new SyndFeedInput().build(new XmlReader(connection)); 
}catch(Exception){handle...} 

Mã hoạt động tốt, ngoại trừ khách hàng mới này, nơi họ sử dụng proxy.

Để sử dụng các proxy, tôi đặt http.proxyHost và proxyPort thuộc tính hệ thống:

System.setProperty("http.proxyHost", proxyHost); 
System.setProperty("http.proxyPort", proxyPort); 
System.setProperty("https.proxyHost", proxyHost); 
System.setProperty("https.proxyPort", proxyPort); 

HTTP GET được thực hiện để proxy ổn, nhưng bây giờ tôi nhận được một HTTP 502 lỗi (xấu gateway hoặc một cái gì đó tương tự).

Phân tích trao đổi HTTP với Wireshark, tôi nhận thấy rằng proxy yêu cầu xác thực. Nó gửi một HTTP 507. Java bằng cách nào đó cố gắng xác thực nhưng nó sử dụng tên người dùng và mật khẩu sai. Dường như sử dụng tên máy chủ làm tên người dùng, như đối với mật khẩu tôi không biết.

Vì vậy, tôi đã cố gắng để thực hiện các phương pháp Authenticator chỉ định một tên người dùng + mật khẩu:

Authenticator.setDefault(new Authenticator() { 
      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       logger.info(MessageFormat.format("Generating PasswordAuthentitcation for proxy authentication, using username={0} and password={1}.", username, password)); 
       return new PasswordAuthentication(username, password.toCharArray()); 
      } 
     }); 

Bây giờ vấn đề của tôi là nó được bỏ qua. Phương thức getPasswordAuthentication không bao giờ được gọi. Tôi không thấy câu lệnh ghi nhật ký trong tệp nhật ký và sử dụng Wireshark tôi có thể thấy rằng nó vẫn sử dụng tên máy chủ lưu trữ làm tên người dùng.

Tại sao? Có vẻ như java bằng cách nào đó cố gắng tự xác thực mà không cần tham khảo Authenticator.

Proxy có vẻ là thiết bị MS sử dụng NTLM để xác thực. Có một số cơ chế tích hợp trong java để xử lý điều này? Máy chạy ứng dụng là Win Server 2008 R2.

Trả lời

12

Chúng tôi đã làm như vậy ở đây để xác thực trên proxy dựa trên NTLM.

Xác thực trên proxy thực tế là xác thực HTTP HTTP cơ bản bình thường.

Chúng tôi sử dụng các phương pháp sau đây:

protected URLConnection newURLConnection(URL pURL) throws IOException { 
    URLConnection urlConnection = super.newURLConnection(pURL); 

    String auth = new String(Base64.base64Encode(new String("username:password").getBytes())); 
    auth = "Basic " + auth; 
    urlConnection.setRequestProperty("Proxy-Connection","Keep-Alive"); 
    urlConnection.setRequestProperty("Proxy-Authorization",auth); 
    return urlConnection; 
} 

đó, cùng với việc cài đặt proxy JVM, đã làm các trick.

Xem http://en.wikipedia.org/wiki/Basic_access_authentication.

+0

Cảm ơn rất nhiều. nó cũng làm việc cho chúng ta. –

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