חיבור דרך שרתי פרוקסי ב- Core Java

1. הקדמה

שרתי פרוקסי משמשים כמתווכים בין יישומי לקוח לשרתים אחרים. במסגרת ארגונית, אנו משתמשים בהם לעתים קרובות בכדי לסייע במתן שליטה על התוכן שמשתמשים צורכים, לרוב על גבולות הרשת.

במדריך זה נבחן כיצד להתחבר דרך שרתי proxy בג'אווה.

ראשית, נחקור את הגישה הוותיקה והעולמית יותר הכוללת JVM ומוגדרת עם מאפייני מערכת. לאחר מכן נציג את פרוקסי class, מה שנותן לנו שליטה רבה יותר בכך שהוא מאפשר תצורה על בסיס חיבור.

2. התקנה

כדי להריץ את הדוגמאות במאמר זה, נצטרך גישה לשרת proxy. קלמארי הוא יישום פופולרי הזמין עבור מרבית מערכות ההפעלה. תצורת ברירת המחדל של דיונון תהיה מספיק טובה לרוב הדוגמאות שלנו.

3. שימוש בהגדרה גלובלית

Java חושפת קבוצה של מאפייני מערכת שבהם ניתן להשתמש כדי להגדיר התנהגות רחבה של JVM. גישה זו "בגודל אחד מתאים לכל" היא לרוב הפשוטה ביותר ליישום אם היא מתאימה למקרה השימוש.

אנחנו יכולים הגדר את המאפיינים הנדרשים משורת הפקודה בעת הפעלת ה- JVM. כחלופה, אנחנו יכולים גם קבע אותם על ידי התקשרות System.setProperty () בזמן ריצה.

3.1. מאפייני מערכת זמינים

Java מספקת מטפלי פרוקסי לפרוטוקולי HTTP, HTTPS, FTP ו- SOCKS. ניתן להגדיר שרת proxy עבור כל מטפל כשם מארח ומספר יציאה:

  • http.proxyHost - שם המארח של שרת ה- proxy של HTTP
  • http.proxyPort - מספר היציאה של שרת ה- proxy של HTTP - המאפיין הוא אופציונלי וברירת המחדל היא 80 אם לא מסופק
  • http.nonProxyHosts - רשימה המופרדת על ידי צינור ("|") של דפוסי מארח שעבורם יש לעקוף את ה- proxy - חלה על מטפלי HTTP ו- HTTPS אם הם מוגדרים
  • גרביים ProxyHost- שם המארח של שרת ה- proxy של SOCKS
  • גרביים ProxyPort- מספר היציאה של שרת ה- proxy של SOCKS

אם מפרט nonProxyHosts, דפוסי מארח עשויים להתחיל או להסתיים בתו תו כללי ("*"). יתכן שיהיה צורך להימלט מה" | | " תוחם בפלטפורמות Windows. רשימה ממצה של כל מאפייני המערכת הזמינים הקשורים לפרוקסי, ניתן למצוא בתיעוד Java הרשמי של אורקל על מאפייני רשת.

3.2. הגדר באמצעות ארגומנטים של שורת פקודה

אנו יכולים להגדיר פרוקסי בשורת הפקודה על ידי העברת ההגדרות כמאפייני מערכת:

java -Dhttp.proxyHost = 127.0.0.1 -Dhttp.proxyPort = 3128 com.baeldung.networking.proxies.CommandLineProxyDemo

כאשר אנו מתחילים תהליך בדרך זו, אנו יכולים להשתמש בפשטות openConnection () על כתובת אתר ללא כל עבודה נוספת:

URL url = URL חדש (RESOURCE_URL); URLConnection con = url.openConnection ();

3.3. הגדר באמצעות System.setProperty (מחרוזת, מחרוזת)

אם איננו יכולים להגדיר מאפייני פרוקסי בשורת הפקודה, אנו יכולים להגדיר אותם באמצעות שיחות אל System.setProperty () במסגרת התוכנית שלנו:

System.setProperty ("http.proxyHost", "127.0.0.1"); System.setProperty ("http.proxyPort", "3128"); URL url = URL חדש (RESOURCE_URL); URLConnection con = url.openConnection (); // ...

אם מאוחר יותר אנו מגדירים את מאפייני המערכת הרלוונטיים באופן ידני, אז לא ישמש עוד את ה- proxy:

System.setProperty ("http.proxyHost", null);

3.4. מגבלות התצורה הגלובלית

למרות ששימוש בתצורה גלובלית עם מאפייני מערכת קל ליישום, גישה זו מגביל את מה שאנחנו יכולים לעשות מכיוון שההגדרות חלות על כל ה- JVM. מסיבה זו, הגדרות שהוגדרו עבור פרוטוקול מסוים פעילות לכל אורך חיי ה- JVM או עד לביטול ההגדרה.

כדי לעקוף את המגבלה הזו, זה עשוי להיות מפתה להפוך את ההגדרות לסירוגין לפי הצורך. כדי לעשות זאת בבטחה בתכנית מרובת שרשורים, יהיה צורך להנהיג אמצעים להגנה מפני בעיות במקביל.

כחלופה, ה- Proxy API מספק שליטה פרטנית יותר בתצורת ה- proxy.

4. באמצעות פרוקסי ממשק API

ה פרוקסי class נותן לנו דרך גמישה להגדיר proxies על בסיס חיבור. אם קיימות הגדרות שרת proxy כוללות JVM, הגדרות שרת proxy מבוססות חיבור באמצעות פרוקסי הכיתה תעקוף אותם.

ישנם שלושה סוגים של יישומי proxy שאנו יכולים להגדיר על ידיו פרוקסי. סוג:

  • HTTP - proxy המשתמש בפרוטוקול HTTP
  • גרביים - proxy המשתמש בפרוטוקול SOCKS
  • ישיר - חיבור ישיר שהוגדר במפורש ללא פרוקסי

4.1. באמצעות פרוקסי HTTP

כדי להשתמש ב- proxy HTTP, ראשית לעטוף א SocketAddress מופע עם א פרוקסי וסוג של Proxy.Type.HTTP. לאחר מכן, אנו פשוט מעבירים את פרוקסי מופע ל URLConnection.openConnection ():

URL weburl = URL חדש (URL_STRING); Proxy webProxy = Proxy חדש (Proxy.Type.HTTP, InetSocketAddress חדש ("127.0.0.1", 3128)); HttpURLConnection webProxyConnection = (HttpURLConnection) weburl.openConnection (webProxy);

במילים פשוטות, זה אומר שאנחנו נתחבר ל URL_STRING, אך אז נתב את החיבור דרך שרת proxy המתארח ב 127.0.0.1:3128.

4.2. שימוש ב- DIRECT Proxy

ייתכן שיש לנו דרישה להתחבר ישירות למארח. במקרה זה, אנו יכולים במפורש עקוף פרוקסי שעשוי להיות מוגדר באופן גלובלי באמצעות הסטטי פרוקסי. NO_PROXY למשל. תחת הכיסויים, ה- API בונה מופע חדש של פרוקסי עבורנו, באמצעות Proxy.Type.DIRECT כסוג:

HttpURLConnection directConnection = (HttpURLConnection) weburl.openConnection (Proxy.NO_PROXY);

בעיקרון, אם אין שרת proxy מוגדר גלובלי, זה זהה להתקשרות openConnection () ללא ויכוחים.

4.3. שימוש ב- SOCKS Proxy

שימוש ב- proxy של SOCKS דומה לגרסת ה- HTTP כאשר עובדים עם חיבור URLC. אנחנו מתחילים ב עוטף א SocketAddress מופע עם א פרוקסי באמצעות סוג של Proxy.Type.SOCKS. לאחר מכן אנו עוברים את פרוקסי מופע ל URLConnection.openConnection:

גרבי פרוקסי Proxy = Proxy חדש (Proxy.Type.SOCKS, InetSocketAddress חדש ("127.0.0.1", 1080)); HttpURLConnection socksConnection = (HttpURLConnection) weburl.openConnection (socksProxy); 

אפשר גם השתמש ב- proxy של SOCKS בעת התחברות לשקע TCP. ראשית, אנו משתמשים ב- פרוקסי למשל לבנות א שֶׁקַע. אחר כך אנחנו לעבור את היעד SocketAddress מופע ל Socket.connect ():

שקע proxySocket = שקע חדש (socksProxy); InetSocketAddress socketHost = InetSocketAddress חדש (SOCKET_SERVER_HOST, SOCKET_SERVER_PORT); proxySocket.connect (socketHost);

5. מסקנה

במאמר זה בדקנו כיצד לעבוד עם שרתי proxy ב- Java הליבה.

ראשית, בחנו את הסגנון הוותיק והעולמי יותר של חיבור דרך שרתי proxy באמצעות מאפייני מערכת. ואז ראינו כיצד להשתמש ב- פרוקסי מחלקה, המספקת שליטה דקה בעת חיבור דרך שרתי proxy.

כמו תמיד, כל קוד המקור המשמש במאמר זה ניתן למצוא באתר GitHub.