Ngiêm cấm sử đụng PROXY và VPS vào mục đích trái pháp luật bạn sẽ phải chịu toàn bộ trách nhiệm trước pháp luật khi sử dụng dịch vụ của chúng tôi tks!
Java proxy: Cấu hình HttpClient, OkHttp và JVM qua proxy

Java proxy: Cấu hình HttpClient, OkHttp và JVM qua proxy

Chuyên viên Kỹ thuật ProxyVN 05-19-2026 Đang tính... phút đọc

Java proxy là cách cấu hình để chương trình Java gửi yêu cầu mạng qua máy chủ proxy, áp dụng cho cả máy ảo Java (JVM) lẫn từng thư viện HTTP như java.net.http.HttpClient, OkHttp hay Jsoup. Lập trình viên cần nắm cách này khi viết công cụ thu thập dữ liệu, chạy ứng dụng sau proxy công ty, hoặc gọi API cần IP theo vùng. Bài này ProxyVN hướng dẫn từng lớp cấu hình, cách dùng proxy có mật khẩu, SOCKS5 và cách sửa các lỗi hay gặp. Xem thêm dịch vụ tại ProxyVN.

Tổng quan về Java proxy

Trong Java, proxy có thể được khai báo ở ba lớp: toàn bộ máy ảo qua thuộc tính hệ thống, từng thư viện qua đối tượng Proxy hoặc ProxySelector, và từng yêu cầu khi thư viện cho phép. Mỗi lớp có phạm vi và mức ưu tiên khác nhau. Hiểu ba lớp này giúp tránh tình huống đã cấu hình proxy mà yêu cầu vẫn đi thẳng.

Một điểm cần phân biệt: "proxy" trong Java còn là tên của mẫu thiết kế Proxy Pattern và lớp java.lang.reflect.Proxy dùng tạo đối tượng đại diện. Hai khái niệm đó thuộc về lập trình hướng đối tượng, không liên quan tới máy chủ proxy mạng. Bài này chỉ nói về proxy mạng.

Khi nào cần Java proxy

  • Ứng dụng chạy trong mạng công ty: máy chủ chỉ ra Internet qua proxy, Maven, Gradle và ứng dụng đều cần cấu hình.
  • Thu thập dữ liệu bằng Jsoup hoặc OkHttp: chia yêu cầu qua nhiều IP để không bị chặn.
  • Kiểm thử ứng dụng theo vùng: gọi API, mở trang với IP Việt Nam, Mỹ, Nhật để so sánh kết quả.
  • Ẩn IP máy chủ: không để dịch vụ bên ngoài biết IP thật của máy chủ chạy ứng dụng.

Ba lớp cấu hình proxy trong Java

Ba lớp cấu hình proxy trong Java

Thứ tự ưu tiên giữa các lớp

Cấu hình ở mức yêu cầu hoặc thư viện thường đè lên thuộc tính hệ thống. Ví dụ OkHttp có proxy riêng thì bỏ qua http.proxyHost. HttpURLConnection mở bằng openConnection(Proxy) cũng bỏ qua thuộc tính hệ thống. Nếu thư viện không khai báo gì, phần lớn thư viện dùng ProxySelector mặc định, mà ProxySelector mặc định lại đọc thuộc tính hệ thống. Vì vậy cách đơn giản nhất để cả ứng dụng đi qua proxy là đặt thuộc tính hệ thống.

Cấu hình Java proxy bằng thuộc tính JVM

Oracle liệt kê đầy đủ các thuộc tính mạng trong trang Networking Properties. Dưới đây là nhóm thuộc tính proxy hay dùng.

Thuộc tính JVM cho proxy

Thuộc tính JVM cho proxy

Bảng: Cấu hình Java proxy bằng thuộc tính JVM

Thuộc tính

Ý nghĩa

Ví dụ

http.proxyHost, http.proxyPort

Proxy cho địa chỉ HTTP

103.x.x.x, 8080

https.proxyHost, https.proxyPort

Proxy cho địa chỉ HTTPS

103.x.x.x, 8080

http.nonProxyHosts

Danh sách không dùng proxy, cách nhau bằng dấu gạch đứng

localhost, 127.*, *.noibo.vn

socksProxyHost, socksProxyPort

Proxy SOCKS cho mọi kết nối TCP

103.x.x.x, 1080

socksProxyVersion

Phiên bản SOCKS

5

java.net.useSystemProxies

Dùng proxy của hệ điều hành

true

Đặt bằng tham số dòng lệnh

java -Dhttp.proxyHost=103.x.x.x -Dhttp.proxyPort=8080 \
     -Dhttps.proxyHost=103.x.x.x -Dhttps.proxyPort=8080 \
     -Dhttp.nonProxyHosts="localhost|127.0.0.1" \
     -jar ungdung.jar

Cách này không cần sửa mã, phù hợp khi chạy ứng dụng có sẵn. Lưu ý https.proxyHost là proxy dùng cho địa chỉ đích HTTPS, không có nghĩa proxy phải chạy TLS. Phần lớn trường hợp hai cặp http và https điền cùng một proxy.

Đặt trong mã

Gọi System.setProperty("https.proxyHost", "103.x.x.x") trước khi tạo kết nối đầu tiên. Một số thư viện đọc thuộc tính một lần khi khởi tạo, nên đặt muộn có thể không có tác dụng. Đặt ngay đầu hàm main là an toàn nhất.

Danh sách không dùng proxy

http.nonProxyHosts dùng dấu gạch đứng để tách, hỗ trợ dấu sao ở đầu hoặc cuối. Danh sách này áp dụng cho cả HTTP và HTTPS. Thiếu danh sách này, yêu cầu tới dịch vụ nội bộ hay máy chủ cơ sở dữ liệu qua HTTP cũng bị đẩy qua proxy và thất bại. Khái niệm này tương tự biến NO_PROXY, bài NO_PROXY là gì giải thích chi tiết hơn.

Dùng proxy của hệ điều hành

Đặt java.net.useSystemProxies=true để Java đọc cấu hình proxy của Windows, macOS hoặc GNOME. Cách này tiện cho ứng dụng máy bàn, nhưng hành vi giữa các hệ điều hành không giống nhau ở mọi chi tiết và không hỗ trợ đầy đủ tệp PAC. Với ứng dụng máy chủ, khai báo rõ ràng vẫn đáng tin cậy hơn.

Biến JAVA_TOOL_OPTIONS

Khi không sửa được lệnh chạy, ví dụ công cụ khởi động Java bên trong, đặt biến môi trường JAVA_TOOL_OPTIONS chứa các tham số -D. Máy ảo Java đọc biến này khi khởi động và in thông báo "Picked up JAVA_TOOL_OPTIONS". Cách này hay dùng cho công cụ dựng như Maven, Gradle, cách cấu hình riêng cho hai công cụ đó có trong bài Maven Gradle proxy.

Java proxy với java.net.http.HttpClient

HttpClient có từ Java 11, hỗ trợ HTTP/2 và gọi bất đồng bộ, hiện là lựa chọn mặc định cho mã mới. Tài liệu ở trang HttpClient của Oracle.

Khai báo proxy

HttpClient client = HttpClient.newBuilder()
    .proxy(ProxySelector.of(new InetSocketAddress("103.x.x.x", 8080)))
    .connectTimeout(Duration.ofSeconds(10))
    .build();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.ipify.org")).build();
String ip = client.send(req, HttpResponse.BodyHandlers.ofString()).body();
System.out.println(ip);

ProxySelector.of tạo bộ chọn luôn trả về một proxy. Nếu kết quả in ra là IP của proxy, cấu hình đã đúng. Không gọi proxy() thì HttpClient đi thẳng, không dùng ProxySelector mặc định, đây là khác biệt so với HttpURLConnection.

ProxySelector tuỳ biến

Khi cần chọn proxy theo tên miền, viết lớp kế thừa ProxySelector, ghi đè select(URI) để trả về proxy khác nhau tuỳ địa chỉ, và connectFailed để ghi nhận proxy lỗi. Chi tiết có trong trang ProxySelector của Oracle. Cách này hữu ích khi một ứng dụng vừa gọi dịch vụ nội bộ vừa gọi dịch vụ ngoài.

Giới hạn: không hỗ trợ SOCKS

HttpClient chỉ dùng được proxy HTTP. Nếu ProxySelector trả về proxy kiểu SOCKS, yêu cầu sẽ lỗi hoặc đi thẳng tuỳ phiên bản. Khi bắt buộc phải dùng SOCKS5, chọn OkHttp hoặc HttpURLConnection, hoặc dùng cổng HTTP của cùng proxy.

Java proxy có xác thực

Proxy trả phí thường cần tài khoản mật khẩu. Java xử lý xác thực proxy qua lớp Authenticator, với vài điểm cần lưu ý từ các bản Java 8 về sau.

Xác thực proxy trong Java

Xác thực proxy trong Java

Dùng Authenticator với HttpClient

Authenticator auth = new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        if (getRequestorType() == RequestorType.PROXY) {
            return new PasswordAuthentication("user", "matkhau".toCharArray());
        }
        return null;
    }
};
HttpClient client = HttpClient.newBuilder()
    .proxy(ProxySelector.of(new InetSocketAddress("103.x.x.x", 8080)))
    .authenticator(auth)
    .build();

Kiểm tra getRequestorType để chỉ trả mật khẩu cho proxy, không trả nhầm cho website đích khi website cũng yêu cầu xác thực.

Bẫy Basic bị tắt khi mở đường hầm HTTPS

Từ Java 8u111, kiểu xác thực Basic bị tắt mặc định khi mở đường hầm CONNECT tới địa chỉ HTTPS. Hậu quả: proxy dùng Basic sẽ luôn trả 407 dù tài khoản đúng. Bật lại bằng thuộc tính:

-Djdk.http.auth.tunneling.disabledSchemes=""
-Djdk.http.auth.proxying.disabledSchemes=""

Thuộc tính đầu áp dụng cho đường hầm HTTPS, thuộc tính sau cho yêu cầu HTTP thường qua proxy. Đặt bằng System.setProperty thì phải đặt trước khi tạo kết nối đầu tiên. Đây là nguyên nhân phổ biến nhất khiến lập trình viên Java tưởng proxy hỏng.

Xác thực bằng IP whitelist

Thêm IP công khai của máy chủ chạy Java vào trang quản lý proxy, khi đó không cần Authenticator. Cách này gọn nhưng phụ thuộc IP máy chủ không đổi. So sánh hai cách xác thực có trong bài xác thực proxy bằng IP whitelist hay user password.

Authenticator.setDefault và ảnh hưởng toàn cục

Authenticator.setDefault đặt bộ xác thực cho cả máy ảo, mọi thư viện dùng HttpURLConnection đều dùng chung. Tiện khi cần nhanh, nhưng dễ trả nhầm mật khẩu cho dịch vụ khác. Với ứng dụng lớn, gắn Authenticator riêng cho từng client là cách an toàn hơn.

Java proxy với OkHttp

OkHttp là thư viện HTTP phổ biến trong Android và nhiều dự án Java máy chủ. Cách khai báo proxy rõ ràng và hỗ trợ cả SOCKS.

Proxy HTTP có mật khẩu

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("103.x.x.x", 8080));
Authenticator proxyAuth = (route, response) -> {
    String cred = Credentials.basic("user", "matkhau");
    return response.request().newBuilder()
        .header("Proxy-Authorization", cred).build();
};
OkHttpClient client = new OkHttpClient.Builder()
    .proxy(proxy)
    .proxyAuthenticator(proxyAuth)
    .connectTimeout(10, TimeUnit.SECONDS)
    .build();

Ở đây Authenticator là interface của OkHttp (okhttp3.Authenticator), khác với java.net.Authenticator. proxyAuthenticator được gọi khi proxy trả 407, OkHttp tự gửi lại yêu cầu với tiêu đề xác thực.

Proxy SOCKS5

Đổi Proxy.Type.HTTP thành Proxy.Type.SOCKS và dùng cổng SOCKS. OkHttp dựa vào lớp Socket của Java cho SOCKS, nên xác thực SOCKS dùng java.net.Authenticator chứ không dùng proxyAuthenticator. Đây là điểm hay gây nhầm lẫn. Khác biệt giữa hai giao thức có trong bài proxy HTTP và SOCKS5.

Tái sử dụng client

Tạo một OkHttpClient cho mỗi proxy và dùng lại cho nhiều yêu cầu. Client giữ bể kết nối, tạo mới cho mỗi yêu cầu vừa chậm vừa tốn tài nguyên. Khi cần nhiều proxy, dùng newBuilder() từ client gốc để chia sẻ bể luồng nhưng đổi proxy.

Java proxy với Jsoup và HttpURLConnection

Jsoup là thư viện phân tích HTML phổ biến cho công việc thu thập dữ liệu. HttpURLConnection là lớp có sẵn từ lâu, nhiều mã cũ vẫn dùng.

Jsoup

Jsoup có phương thức proxy(host, port) trên Connection, theo tài liệu API của Jsoup. Ví dụ Jsoup.connect(url).proxy("103.x.x.x", 8080).userAgent(...).timeout(15000).get(). Với proxy có mật khẩu, bản Jsoup mới hỗ trợ phương thức auth nhận bộ xác thực; với bản cũ, dùng java.net.Authenticator.setDefault kèm thuộc tính tunneling ở trên.

HttpURLConnection

Mở kết nối bằng url.openConnection(proxy) với đối tượng Proxy, kết nối đó dùng proxy riêng bất kể thuộc tính hệ thống. Truyền Proxy.NO_PROXY để ép đi thẳng. Xác thực dùng java.net.Authenticator như HttpClient.

Selenium và trình duyệt điều khiển bằng Java

Khi dùng Selenium với Java, proxy cấu hình cho trình duyệt chứ không phải cho JVM. Thuộc tính http.proxyHost chỉ ảnh hưởng tới kết nối của mã Java tới WebDriver, không ảnh hưởng trình duyệt. Cách cấu hình proxy cho trình duyệt trong Selenium có trong bài cài đặt Selenium Python proxy, nguyên tắc giống nhau giữa các ngôn ngữ.

Sửa các lỗi thường gặp với Java proxy

Phần lớn lỗi proxy trong Java rơi vào vài nhóm: xác thực, sai loại proxy, thời gian chờ và chứng chỉ.

Sửa lỗi tunnel 407

Sửa lỗi tunnel 407

Unable to tunnel through proxy, 407

Thông báo đầy đủ thường là "java.io.IOException: Unable to tunnel through proxy. Proxy returns HTTP/1.1 407 Proxy Authentication Required". Kiểm tra theo thứ tự: tài khoản mật khẩu đúng chưa, đã đặt jdk.http.auth.tunneling.disabledSchemes rỗng chưa, Authenticator có trả về cho RequestorType.PROXY không, IP máy chủ có trong whitelist không. Cơ chế mã 407 nói chung có trong bài sửa lỗi 407 Proxy Authentication Required.

Bảng lỗi và cách sửa

Bảng: Bảng lỗi và cách sửa

Thông báo

Nguyên nhân khả dĩ

Cách sửa

Connection refused

Proxy chết, sai cổng

Thử proxy bằng curl, kiểm tra cổng

Connect timed out

Proxy chậm, tường lửa chặn

Tăng connectTimeout, đổi proxy

Unable to tunnel through proxy 407

Basic bị tắt, sai tài khoản

Đặt disabledSchemes rỗng, sửa tài khoản

SOCKS: Malformed reply from SOCKS server

Dùng SOCKS vào cổng HTTP

Đổi Proxy.Type hoặc cổng

PKIX path building failed

Proxy công ty giải mã HTTPS

Thêm chứng chỉ gốc vào truststore

Yêu cầu vẫn ra IP thật

HttpClient chưa gọi proxy()

Khai báo proxy trong builder

PKIX path building failed

Lỗi này xuất hiện khi Java không tin chứng chỉ mà máy chủ hoặc proxy đưa ra. Trong mạng công ty có proxy giải mã HTTPS, cần nhập chứng chỉ gốc của công ty vào truststore bằng công cụ keytool. Không nên tắt kiểm tra chứng chỉ bằng TrustManager chấp nhận tất cả, vì cách đó mở đường cho tấn công trung gian.

Ghi log mạng để gỡ lỗi

Đặt -Djdk.httpclient.HttpClient.log=all cho HttpClient, hoặc thêm HttpLoggingInterceptor cho OkHttp để xem chi tiết yêu cầu. Log cho thấy kết nối tới proxy nào, có gửi tiêu đề Proxy-Authorization không, proxy trả mã gì. Nhớ tắt log chi tiết trên môi trường chạy thật vì log có thể chứa mật khẩu.

Xoay Java proxy cho công việc thu thập dữ liệu

Khi gửi nhiều yêu cầu, xoay qua nhiều proxy giúp tránh giới hạn tần suất theo IP.

Danh sách proxy và chọn lần lượt

Đọc danh sách proxy từ tệp cấu hình, mỗi dòng một proxy cùng định dạng. Dùng AtomicInteger làm bộ đếm để chọn lần lượt an toàn khi nhiều luồng cùng chạy. Các định dạng proxy phổ biến được liệt kê trong bài định dạng proxy.

Loại proxy lỗi

Bọc yêu cầu trong khối try, khi gặp lỗi kết nối hay thời gian chờ thì tăng bộ đếm lỗi của proxy đó, vượt ngưỡng thì tạm loại. Với HttpClient, ProxySelector tuỳ biến có sẵn phương thức connectFailed để ghi nhận. Cách thiết kế dự phòng được bàn kỹ trong bài proxy failover.

Giới hạn số luồng mỗi proxy

Dùng ExecutorService với số luồng cố định, mỗi proxy chỉ gánh một số luồng nhất định. Gửi quá nhiều yêu cầu song song qua một IP dễ bị website đích giới hạn. Bài 1 proxy chạy được bao nhiêu luồng giúp ước lượng con số phù hợp.

Chọn IP phù hợp thị trường

Thu thập giá hay kiểm tra nội dung cho thị trường Việt Nam cần IP Việt Nam để thấy đúng dữ liệu người dùng trong nước thấy. Nếu cần IP Việt Nam theo nhà mạng cho ứng dụng Java, anh em có thể mua proxy tại ProxyVN, mỗi proxy hỗ trợ cả HTTP và SOCKS5 nên dùng được với HttpClient lẫn OkHttp.

Kiểm tra Java proxy đã hoạt động đúng

Cấu hình xong mà không kiểm tra thì rất dễ chạy cả ngày qua IP thật mà không biết. Vài bước kiểm tra dưới đây nên trở thành thói quen.

Gọi dịch vụ trả về IP

Đầu chương trình, gửi một yêu cầu tới dịch vụ trả về IP như api.ipify.org và in kết quả. So với IP máy chủ, nếu khác và trùng với IP proxy là đúng. Với proxy xoay, gọi vài lần cách nhau vài phút để thấy IP có đổi theo đúng chu kỳ không.

Kiểm tra cả HTTP và HTTPS

Vì Java tách riêng http.proxyHost và https.proxyHost, có trường hợp chỉ một loại đi qua proxy. Gửi một yêu cầu tới địa chỉ HTTP và một tới địa chỉ HTTPS, so sánh IP trả về. Hai IP khác nhau nghĩa là thiếu một cặp thuộc tính.

Kiểm tra DNS khi dùng SOCKS5

Khi dùng SOCKS5 qua Socket của Java, tên miền thường được gửi nguyên cho proxy phân giải nếu tạo InetSocketAddress bằng createUnresolved. Nếu tạo bằng tên miền thông thường, Java có thể tự phân giải trước, làm truy vấn DNS đi từ máy chủ. Với công việc cần ẩn danh, kiểm tra kỹ điểm này bằng công cụ bắt gói tin.

Đo thời gian phản hồi

Ghi lại thời gian từ lúc gửi tới lúc nhận phản hồi khi bật và tắt proxy. Proxy thêm một chặng nên luôn chậm hơn, nhưng nếu chậm gấp nhiều lần, proxy đang quá tải hoặc ở quá xa máy chủ đích. Bài test ping khi mua proxy hướng dẫn đo độ trễ trước khi chọn proxy.

Hiệu năng khi dùng Java proxy

Ứng dụng Java thường chạy lâu và gửi rất nhiều yêu cầu. Vài điểm cấu hình nhỏ ảnh hưởng lớn tới tốc độ khi đi qua proxy.

Giữ kết nối với proxy

Mở kết nối TCP tới proxy và bắt tay TLS với website đích tốn thời gian. HttpClient và OkHttp đều có bể kết nối, dùng lại kết nối cũ cho yêu cầu kế tiếp tới cùng địa chỉ. Tạo client mới cho mỗi yêu cầu sẽ mất lợi ích này và làm proxy phải mở kết nối liên tục.

HTTP/2 qua proxy

HttpClient mặc định thử HTTP/2 với địa chỉ HTTPS. Qua proxy HTTP, đường hầm CONNECT vẫn cho phép HTTP/2 vì bắt tay TLS diễn ra trực tiếp với website đích. Nếu gặp lỗi lạ khi qua proxy, thử ép phiên bản HTTP/1.1 bằng version(HttpClient.Version.HTTP_1_1) để xem lỗi có liên quan HTTP/2 không.

Đặt thời gian chờ hợp lý

Thời gian chờ kết nối khoảng 5 đến 10 giây đủ để bỏ nhanh proxy chết. Thời gian chờ đọc tuỳ loại trang, trang nặng có thể cần 30 giây. Không đặt thời gian chờ thì một proxy treo có thể giữ luồng mãi mãi, làm cả bể luồng cạn dần.

Giảm dung lượng

Với proxy tính theo dung lượng, chỉ tải phần cần thiết. Gửi tiêu đề Accept-Encoding gzip để nhận dữ liệu nén, OkHttp tự làm việc này. Gọi API JSON thay vì tải trang HTML đầy đủ khi có thể.

Bảo mật thông tin Java proxy

Thông tin proxy gồm địa chỉ, cổng và mật khẩu. Để lộ ra ngoài có thể khiến người khác dùng ké proxy, làm IP bị đánh dấu xấu.

Không viết mật khẩu trong mã nguồn

Đọc tài khoản proxy từ biến môi trường hoặc kho bí mật của hạ tầng. Tệp cấu hình chứa mật khẩu không đưa lên kho Git. Với Spring Boot, dùng biến môi trường ghi đè thuộc tính trong tệp cấu hình.

Cẩn thận với tham số dòng lệnh

Mật khẩu truyền bằng tham số -D hiện trong danh sách tiến trình, người dùng khác trên cùng máy có thể đọc được. Với máy chủ dùng chung, đọc mật khẩu từ tệp có quyền hạn chế hoặc biến môi trường thay vì tham số dòng lệnh.

Không ghi mật khẩu vào log

Log ở mức gỡ lỗi của HttpClient và OkHttp có thể in tiêu đề Proxy-Authorization. Bật log chi tiết chỉ khi gỡ lỗi, và lọc tiêu đề nhạy cảm trước khi gửi log lên hệ thống tập trung.

Java proxy trong Spring Boot

Spring Boot là framework phổ biến nhất cho ứng dụng Java máy chủ. Mỗi client HTTP trong Spring có cách cấu hình proxy riêng.

RestTemplate

RestTemplate dùng một request factory bên dưới. Với SimpleClientHttpRequestFactory, gọi setProxy với đối tượng Proxy. Với factory dựa trên Apache HttpClient, cấu hình proxy trong HttpClient rồi truyền vào factory.

WebClient

WebClient chạy trên Reactor Netty, cấu hình proxy qua HttpClient của Reactor Netty với phương thức proxy, chọn kiểu HTTP hoặc SOCKS5 và khai báo tài khoản. Cấu hình này nằm trong bean WebClient dùng chung cho cả ứng dụng.

Đưa cấu hình ra tệp properties

Đặt host, port, tài khoản proxy trong application.yml hoặc biến môi trường, đọc bằng @ConfigurationProperties. Mỗi môi trường phát triển, kiểm thử, chạy thật có thể dùng proxy khác hoặc không dùng proxy mà không phải sửa mã.

So sánh Java proxy với ngôn ngữ khác

Nếu làm việc với nhiều ngôn ngữ, bảng dưới giúp đối chiếu nhanh.

Bảng: So sánh Java proxy với ngôn ngữ khác

Ngôn ngữ

Lớp cấu hình chính

Hỗ trợ SOCKS5

Java HttpClient

ProxySelector trong builder

Không

Java OkHttp

Proxy và proxyAuthenticator

Có

C#

HttpClientHandler.Proxy

Có từ .NET 6

Go

Transport.Proxy

Có qua gói x/net/proxy

PHP

CURLOPT_PROXY

Có

Hướng dẫn chi tiết cho từng ngôn ngữ có trong các bài C# HttpClient proxy, Golang proxy và PHP cURL proxy.

Câu hỏi thường gặp về Java proxy

Đặt http.proxyHost có áp dụng cho HTTPS không

Không. Địa chỉ HTTPS dùng https.proxyHost và https.proxyPort. Muốn cả hai loại đi qua proxy, đặt cả hai cặp thuộc tính, thường cùng giá trị.

Vì sao HttpClient không dùng proxy dù đã đặt thuộc tính hệ thống

HttpClient của Java 11 không tự dùng ProxySelector mặc định nếu không gọi proxy() trong builder. Gọi .proxy(ProxySelector.getDefault()) để dùng thuộc tính hệ thống, hoặc truyền proxy cụ thể.

Proxy có mật khẩu luôn trả 407 dù tài khoản đúng

Gần như chắc là do kiểu Basic bị tắt khi mở đường hầm HTTPS. Đặt jdk.http.auth.tunneling.disabledSchemes thành chuỗi rỗng trước khi tạo kết nối.

Ứng dụng Android có dùng được các cách trên không

OkHttp chạy tốt trên Android với cách khai báo y hệt. Thuộc tính hệ thống của JVM ít dùng trên Android, proxy hệ thống của thiết bị được cấu hình trong phần cài đặt Wi-Fi.

Có thể dùng proxy khác nhau cho từng luồng không

Được, nếu mỗi luồng dùng client riêng có proxy riêng. Thuộc tính hệ thống áp dụng cho cả máy ảo nên không tách theo luồng được. Với HttpClient, tạo nhiều client, mỗi client một ProxySelector. Với OkHttp, dùng newBuilder() từ client gốc rồi đổi proxy, các client vẫn chia sẻ bể luồng nên không tốn thêm nhiều tài nguyên.

Proxy miễn phí có dùng cho ứng dụng Java được không

Về cấu hình thì giống hệt. Nhưng proxy miễn phí thường chết nhanh, chậm, bị nhiều website chặn sẵn và có thể đọc dữ liệu đi qua kết nối HTTP thường. Ứng dụng phải xử lý thử lại liên tục, mất nhiều công hơn số tiền tiết kiệm được. Rủi ro cụ thể được phân tích trong bài proxy miễn phí có an toàn không.

Tổng kết

Java proxy có ba lớp cấu hình: thuộc tính JVM cho cả ứng dụng, đối tượng Proxy hoặc ProxySelector cho từng thư viện, và cấu hình theo yêu cầu. HttpClient cần gọi proxy() rõ ràng và không hỗ trợ SOCKS, OkHttp linh hoạt hơn, còn lỗi 407 khi mở đường hầm thường do Basic bị tắt mặc định. Cần proxy Việt Nam ổn định cho dự án Java, anh em liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam để được tư vấn.

TIN TỨC LIÊN QUAN