ทำไม Java จึงเลือกพร็อกซี SOCKS สำหรับคำขอ HTTP ของคุณ
ตรวจสอบผลลัพธ์ของ ProxySelector และการตั้งค่า JVM ที่มีผลจริงก่อนใช้วิธีแก้พร็อกซีแบบ Windows เก่า
คำขอ Java อาจพบอินพุตพร็อกซีหลายอย่าง: การกำหนดค่าคไลเอนต์อย่างชัดเจน ตัวเลือกเริ่มต้น คุณสมบัติเครือข่ายของ JVM และการตั้งค่าระบบปฏิบัติการที่รองรับ เมื่อบันทึกกล่าวถึง SOCKS อย่างไม่คาดคิด ให้ระบุว่าอินพุตใดเป็นผู้เลือก
สำหรับโค้ดที่ใช้ตัวเลือกเริ่มต้น ให้ตรวจสอบการตัดสินใจสำหรับปลายทางที่แน่นอน:
URI target = URI.create("https://example.com/");
ProxySelector selector = ProxySelector.getDefault();
if (selector != null) {
System.out.println(selector.select(target));
}
สิ่งนี้รายงานผู้สมัครของตัวเลือก ไม่ได้พิสูจน์ว่าการเชื่อมต่อใดสำเร็จในที่สุด และไคลเอนต์ที่มีเส้นทางชัดเจนของตนเองอาจเลือกต่างออกไป
ตรวจสอบการตั้งค่าที่มีผลจริง
ตรวจสอบ http.proxyHost, https.proxyHost, socksProxyHost, พอร์ตของค่าเหล่านี้ และ java.net.useSystemProxies. เอกสารคุณสมบัติเครือข่ายของ JDK อธิบายขอบเขตและลำดับความสำคัญ การค้นพบพร็อกซีของระบบจะถูกตรวจสอบเมื่อเริ่มต้น ให้ตั้งค่าอย่างตั้งใจเมื่อเริ่ม JVM
คำตอบในอดีตอธิบายการรวมกันเฉพาะของไดอะล็อก Windows เก่าและ JDK เก่า รายงานเหล่านั้นอธิบายที่มาของวิธีแก้ได้ แต่ไม่ได้ยืนยันว่ารันไทม์ปัจจุบันมีบั๊กเดียวกัน บันทึกเวอร์ชันรันไทม์และเอาต์พุตของตัวเลือกก่อนเปลี่ยนการตั้งค่าระบบปฏิบัติการสำหรับทุกแอปพลิเคชัน
หากแอปพลิเคชันต้องการพร็อกซี HTTP สำหรับไคลเอนต์หนึ่งตัว การกำหนดค่าพร็อกซีอย่างชัดเจน ทำให้ข้อกำหนดนั้นชัดเจนขึ้นได้ หากต้องการการกำหนดเส้นทางอัตโนมัติจากศูนย์กลาง ให้ตรวจสอบว่าทำไมตัวเลือกจึงได้รับหรือส่งคืนรายการ SOCKS ที่ไม่คาดคิด
ตัวเลือกที่กำหนดเองควรคงการข้ามตามเจตนาและการจัดการความล้มเหลว การกรองผู้สมัคร SOCKS ทุกรายอย่างไม่เลือกหน้าอาจทำให้การเชื่อมต่อที่ควรใช้รายการนั้นเสียหายได้ แก้ไขกฎที่ไม่ถูกต้องด้วยขอบเขตเล็กที่สุดที่คุณระบุได้