Làm cách nào để tạo kết nối httpURLC sử dụng proxy?


136

Nếu tôi làm điều này ...

conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());

nó in

Proxy? false

Vấn đề là, tôi đứng sau một proxy. JVM lấy thông tin proxy từ đâu trên Windows? Làm thế nào để tôi thiết lập điều này? Tất cả các ứng dụng khác của tôi có vẻ hoàn toàn hài lòng với proxy của tôi.

Câu trả lời:


336

Vì java 1.5, bạn cũng có thể truyền một cá thể java.net.Proxy cho openConnection(proxy)phương thức:

//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);

Nếu proxy của bạn yêu cầu xác thực, nó sẽ cung cấp cho bạn phản hồi 407.

Trong trường hợp này, bạn sẽ cần mã sau đây:

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);

7
chúng tôi có thể cung cấp tên người dùng và mật khẩu proxy thông qua nó.
Xolve

15
Điều gì nếu bạn có các cặp tên người dùng / mật khẩu khác nhau cho các proxy khác nhau? Gọi một phương thức tĩnh để đặt Trình xác thực mặc định không lý tưởng, điều này không tốt hơn nhiều so với đặt phương thức thuộc tính sys ..
javaPhobic

2
Authenticator.default là một biến tĩnh (tức là toàn cầu), vì vậy nó chỉ một lần. Nhưng xin lưu ý rằng Authenticator ở trên chỉ là một ví dụ tối thiểu. Nó chỉ có thể xử lý một mật khẩu tại một thời điểm. Google cho các ví dụ có thể xử lý nhiều máy chủ lưu trữ với các mật khẩu khác nhau.
Stroboskop

3
Kể từ 8u11 này sẽ không hoạt theo mặc định với xác thực Basic, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes sở hữu hệ thống phải được thiết lập để emtpty
trắng

3
Trong trường hợp bạn có tên miền. Thực hiện như sau:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Nhà phát triển Marius ilėnas

34

Điều này khá dễ dàng để trả lời từ internet. Đặt thuộc tính hệ thống http.proxyHosthttp.proxyPort. Bạn có thể làm điều này với System.setProperty()hoặc từ dòng lệnh với -Dcú pháp.


19

Proxy được hỗ trợ thông qua hai thuộc tính hệ thống: http.proxyhost và http.proxyPort. Chúng phải được đặt thành máy chủ proxy và cổng tương ứng. Ví dụ cơ bản sau đây minh họa nó:

String url = "http://www.google.com/",
       proxy = "proxy.mydomain.com",
       port = "8080";
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
readResponse(in);

@Pascal Bạn có biết sự khác biệt chính của việc sử dụng cách tiếp cận Java mới nhất so với Apache là commons-httpclientgì không? Vì Java hỗ trợ ủy quyền và xác thực (như bạn đã đề cập ở đây stackoverflow.com/questions/1626549/ ,), đối với các trường hợp đơn giản (như lấy một tệp từ máy chủ HTTP công cộng), không có lý do gì để sử dụng thư viện Apache. Đề nghị của bạn là gì?
dma_k

@dma_k Tôi đồng ý với bạn, đối với các trường hợp sử dụng đơn giản như trường hợp bạn mô tả tôi sẽ không sử dụng thư viện của bên thứ ba.
Pascal Thivent

Bạn có biết làm thế nào để hỗ trợ các nonProxyhost không? Tôi thấy rằng thiết bị của tôi hỗ trợ nó nhưng không biết cách làm cho ứng dụng của tôi xử lý nó.
RiRomain

Nhưng biến systemPropertieskhông được sử dụng bởi connection!
phân tích cú pháp

12

Bạn cũng có thể thiết lập

-Djava.net.useSystemProxies=true

Trên Windows và Linux, điều này sẽ sử dụng các cài đặt hệ thống, do đó bạn không cần phải lặp lại (DRY)

http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properIES.html#Proxies


6
Điều này chỉ hoạt động với cấu hình máy chủ proxy thủ công. Cấu hình proxy tự động và proxy được định cấu hình thông qua tập lệnh chưa (chưa) được truyền bá sang "useSystemProxies".
Lốp

1
Điều này làm việc cho tôi khi cài đặt proxyhost và proxyPort không. Cảm ơn!
nrobey

Tương tự như vậy, điều này hoạt động từ phía sau proxy công ty của tôi khi gọi System.setPropertycho https.proxyHosthttps.proxyPortvì một lý do nào đó không cắt mù tạt.
Pavel Komarov

10

Đặt theo sau trước khi bạn mởConnection,

System.setProperty("http.proxyHost", "host");
System.setProperty("http.proxyPort", "port_number");

Nếu proxy yêu cầu xác thực,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");

7
Tôi thực sự nghĩ rằng "http.proxyUser" và "http.proxyPassword" không được hỗ trợ nữa. Xem stackoverflow.com/questions/120797/ cấp để biết thêm chi tiết.
p3t0r

5

Đối với Java 1.8 trở lên, bạn phải đặt -Djdk.http.auth.tunneling.disabledSchemes=các proxy với Ủy quyền cơ bản hoạt động với https.


1
Thông tin cơ bản về vấn đề này được thảo luận tại stackoverflow.com/questions/41806422/iêu
U880D

2

Câu trả lời được phê duyệt sẽ hoạt động ... nếu bạn biết máy chủ proxy và cổng =). Nhưng trong trường hợp bạn đang tìm kiếm máy chủ proxy và cổng, các bước dưới đây sẽ giúp

nếu proxy cấu hình tự động được cung cấp: thì

1> mở IE (hoặc bất kỳ trình duyệt nào)

2> nhận địa chỉ url từ trình duyệt của bạn thông qua IE-> Công cụ-> tùy chọn internet-> kết nối-> Cài đặt mạng LAN-> nhận địa chỉ và cung cấp url, ví dụ: như http://autocache.abc.com/ và nhập, a tập tin sẽ được tải xuống với định dạng .pac, lưu vào máy tính để bàn

3> mở tệp .pac trong bảng văn bản, xác định PROXY:

Trong trình soạn thảo của bạn, nó sẽ xuất hiện một cái gì đó như:

trả về "PROXY web-proxy.ind.abc.com:8080; proxy PROXY.sgp.abc.com:8080";

kudos để bekur từ maven trong 5 phút không hoạt động

Khi bạn đã có máy chủ và cổng, hãy tham gia và bạn sẽ tiếp tục

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.