ฉันจะทำให้ HttpURLConnection ใช้พร็อกซีได้อย่างไร


140

ถ้าฉันทำแบบนี้ ...

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

มันพิมพ์

Proxy? false

ปัญหาคือฉันอยู่หลังพร็อกซี JVM รับข้อมูลพร็อกซีจากที่ใดบน Windows ฉันจะตั้งค่านี้ได้อย่างไร? แอพอื่น ๆ ทั้งหมดของฉันดูเหมือนจะมีความสุขกับพร็อกซีของฉัน

คำตอบ:


345

ตั้งแต่ java 1.5 คุณยังสามารถส่งอินสแตนซ์java.net.ProxyไปยังopenConnection(proxy)เมธอด:

//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);

หากพร็อกซีของคุณต้องการการรับรองความถูกต้องมันจะตอบสนองคุณ 407

ในกรณีนี้คุณจะต้องใช้รหัสต่อไปนี้:

    Authenticator authenticator = new Authenticator() {

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

7
เราสามารถระบุชื่อผู้ใช้พร็อกซีและรหัสผ่านพร็อกซีผ่านมันได้ไหม
Xolve

16
จะเกิดอะไรขึ้นหากคุณมีคู่ชื่อผู้ใช้ / รหัสผ่านที่แตกต่างกันสำหรับพร็อกซีที่แตกต่างกัน การเรียกวิธีการแบบคงที่เพื่อตั้งค่า Authenticator เริ่มต้นนั้นไม่เหมาะอย่างยิ่งซึ่งไม่ดีไปกว่าการตั้งค่าวิธีคุณสมบัติ sys ..
javaPhobic

2
Authenticator.default เป็นตัวแปรคงที่ (เช่น global) ดังนั้นจึงเป็นเพียงครั้งเดียว แต่โปรดทราบว่า Authenticator ด้านบนเป็นเพียงตัวอย่างเล็กน้อย สามารถจัดการรหัสผ่านได้ครั้งละหนึ่งรหัสเท่านั้น Google เป็นตัวอย่างที่สามารถจัดการโฮสต์หลายโฮสต์ด้วยรหัสผ่านที่แตกต่างกัน
Stroboskop

3
เนื่องจาก 8u11 สิ่งนี้จะไม่ทำงานตามค่าเริ่มต้นด้วยการรับรองความถูกต้องพื้นฐานoracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes คุณสมบัติระบบต้องตั้งค่าเป็นว่าง
สีขาว

3
ในกรณีที่คุณมีโดเมน ให้ทำดังต่อไปนี้:new PasswordAuthentication("domainName\\user", "password".toCharArray());
พัฒนา Marius Žilėnas

34

นี่เป็นคำตอบที่ค่อนข้างง่ายจากอินเทอร์เน็ต ตั้งค่าคุณสมบัติของระบบhttp.proxyHostและhttp.proxyPort. คุณสามารถทำได้โดยใช้System.setProperty()หรือจากบรรทัดคำสั่งด้วย-Dไวยากรณ์


19

พร็อกซีได้รับการสนับสนุนผ่านคุณสมบัติของระบบสองคุณสมบัติ: http.proxyHost และ http.proxyPort ต้องตั้งค่าเป็นพร็อกซีเซิร์ฟเวอร์และพอร์ตตามลำดับ ตัวอย่างพื้นฐานต่อไปนี้แสดงให้เห็น:

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 คุณรู้หรือไม่ว่าความแตกต่างที่สำคัญของการใช้วิธีการล่าสุดของ Java เมื่อเปรียบเทียบกับ Apache commons-httpclientคืออะไร? เนื่องจาก Java รองรับการพร็อกซีและการพิสูจน์ตัวตน (ดังที่คุณกล่าวไว้ที่นี่stackoverflow.com/questions/1626549/… ) สำหรับกรณีง่ายๆ (เช่นดึงไฟล์หนึ่งไฟล์จากเซิร์ฟเวอร์ HTTP สาธารณะ) จึงไม่มีเหตุผลที่จะใช้ไลบรารี Apache คำแนะนำของคุณคืออะไร?
dma_k

@dma_k ฉันเห็นด้วยกับคุณสำหรับกรณีการใช้งานง่ายๆเช่นที่คุณอธิบายไว้ฉันจะไม่ใช้ไลบรารีของบุคคลที่สาม
Pascal Thivent

คุณรู้วิธีสนับสนุน nonProxyHosts หรือไม่? ฉันเห็นว่าอุปกรณ์ของฉันรองรับ แต่ไม่รู้ว่าจะทำให้แอปจัดการได้อย่างไร
RiRomain

แต่ตัวแปรsystemPropertiesไม่ถูกใช้โดยconnection!
พาร์เซกเกอร์

12

คุณยังสามารถตั้งค่า

-Djava.net.useSystemProxies=true

บน Windows และ Linux สิ่งนี้จะใช้การตั้งค่าระบบดังนั้นคุณไม่จำเป็นต้องทำซ้ำด้วยตัวเอง (DRY)

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


6
ใช้งานได้กับการกำหนดค่าพร็อกซีเซิร์ฟเวอร์ด้วยตนเองเท่านั้น การกำหนดค่าพร็อกซีอัตโนมัติและพร็อกซีที่กำหนดค่าผ่านสคริปต์จะไม่ (ยัง) แพร่กระจายไปยัง "useSystemProxies"
ยาง

1
สิ่งนี้ใช้ได้ผลสำหรับฉันเมื่อตั้งค่า proxyHost และ proxyPort ไม่ได้ ขอบคุณ!
nrobey

ในทำนองเดียวกันสิ่งนี้ทำงานจากด้านหลังพร็อกซีของ บริษัท ของฉันเมื่อมีการโทรไปSystem.setPropertyหาhttps.proxyHostและhttps.proxyPortด้วยเหตุผลบางอย่างก็ไม่ได้ตัดมัสตาร์ด
Pavel Komarov

10

ตั้งค่าต่อไปนี้ก่อนที่คุณจะเปิดการเชื่อมต่อ

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

หากพร็อกซีต้องการการตรวจสอบสิทธิ์

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

7
ฉันคิดว่า "http.proxyUser" และ "http.proxyPassword" ไม่รองรับอีกต่อไป ดูstackoverflow.com/questions/120797/…สำหรับรายละเอียดเพิ่มเติม
p3t0r

5

สำหรับ Java 1.8 ขึ้นไปคุณต้องตั้งค่า-Djdk.http.auth.tunneling.disabledSchemes=ให้สร้างพร็อกซีด้วยการอนุญาตขั้นพื้นฐานที่ทำงานกับ https


1
ข้อมูลความเป็นมาเกี่ยวกับเรื่องนี้มีการพูดคุยที่stackoverflow.com/questions/41806422/…
U880D

2

คำตอบที่ได้รับอนุมัติจะใช้งานได้ ... ถ้าคุณรู้จักพร็อกซีโฮสต์และพอร์ต =) แต่ในกรณีที่คุณกำลังมองหาโฮสต์พร็อกซีและพอร์ตขั้นตอนด้านล่างจะช่วยได้

หากมีการกำหนดพร็อกซีที่กำหนดค่าอัตโนมัติ: แล้ว

1> เปิด IE (หรือเบราว์เซอร์ใดก็ได้)

2> รับที่อยู่ url จากเบราว์เซอร์ของคุณผ่าน IE-> Tools-> internet option-> connections-> LAN Settings-> รับที่อยู่และให้ใน url เช่น: เป็น http://autocache.abc.com/แล้วป้อน a ไฟล์จะถูกดาวน์โหลดด้วยรูปแบบ. pac บันทึกลงในเดสก์ท็อป

3> เปิดไฟล์. pac ใน textpad ระบุ PROXY:

ในตัวแก้ไขของคุณจะมีลักษณะดังนี้:

return "PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";

ความรุ่งโรจน์ถึง bekur จากmaven ใน 5 นาทีไม่ทำงาน

เมื่อคุณมีโฮสต์และพอร์ตเพียงแค่เข้ามาในสิ่งนี้และคุณก็พร้อมที่จะไป

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.