代理验证器、OkHttpClient 提供器(结合 ProxyConfig)
This commit is contained in:
@@ -1,37 +1,23 @@
|
||||
package quant.rich.emoney.entity.config;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Proxy;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.Accessors;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import quant.rich.emoney.entity.config.DeviceInfoConfig.DeviceInfo;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import quant.rich.emoney.client.OkHttpClientProvider;
|
||||
import quant.rich.emoney.interceptor.EnumOptionsInterceptor.EnumOptions;
|
||||
import quant.rich.emoney.interfaces.ConfigInfo;
|
||||
import quant.rich.emoney.interfaces.IConfig;
|
||||
import quant.rich.emoney.interfaces.ValidEmoneyRequestConfig;
|
||||
import quant.rich.emoney.patch.okhttp.PatchOkHttp;
|
||||
import quant.rich.emoney.util.EncryptUtils;
|
||||
import quant.rich.emoney.util.SpringContextHolder;
|
||||
import quant.rich.emoney.util.TextUtils;
|
||||
import quant.rich.emoney.validator.ProxyConfigValid;
|
||||
|
||||
/**
|
||||
* 独立出来一个代理设置的原因是后续可能需要做一个代理池,这样的话独立配置比较适合后续扩展
|
||||
@@ -39,7 +25,7 @@ import quant.rich.emoney.util.TextUtils;
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@Slf4j
|
||||
@ValidEmoneyRequestConfig
|
||||
@ProxyConfigValid
|
||||
@ConfigInfo(field = "proxy", name = "代理设置", initDefault = true)
|
||||
public class ProxyConfig implements IConfig<ProxyConfig> {
|
||||
|
||||
@@ -57,7 +43,7 @@ public class ProxyConfig implements IConfig<ProxyConfig> {
|
||||
/**
|
||||
* 代理端口
|
||||
*/
|
||||
private Integer proxyPort = 0;
|
||||
private Integer proxyPort = 1;
|
||||
|
||||
/**
|
||||
* 是否忽略 HTTPS 证书校验
|
||||
@@ -71,5 +57,66 @@ public class ProxyConfig implements IConfig<ProxyConfig> {
|
||||
|
||||
public ProxyConfig() {}
|
||||
|
||||
/**
|
||||
* 根据配置获取代理
|
||||
* @return
|
||||
*/
|
||||
@JsonIgnore
|
||||
public Proxy getProxy() {
|
||||
if (getProxyType() != null && getProxyType() != Proxy.Type.DIRECT) {
|
||||
return new Proxy(getProxyType(),
|
||||
new InetSocketAddress(getProxyHost(), getProxyPort()));
|
||||
}
|
||||
return Proxy.NO_PROXY;
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试给定的 HTTP 代理是否有效,并验证是否真的走了代理。
|
||||
* @param proxyHost 代理 IP,如 "127.0.0.1"
|
||||
* @param proxyPort 代理端口,如 8888
|
||||
* @return 是否有效
|
||||
*/
|
||||
public static boolean isProxyEffective(Proxy proxy, boolean ignoreHttpsVerification) {
|
||||
synchronized (ProxyConfig.class) {
|
||||
|
||||
// OkHttp 客户端配置
|
||||
OkHttpClient client = OkHttpClientProvider.getInstance(
|
||||
proxy, ignoreHttpsVerification,
|
||||
builder -> builder
|
||||
.connectTimeout(10, TimeUnit.SECONDS)
|
||||
.readTimeout(10, TimeUnit.SECONDS));
|
||||
|
||||
// 使用 httpbin.org/ip 获取当前请求的公网 IP
|
||||
Request request = new Request.Builder()
|
||||
.url("https://httpbin.org/ip")
|
||||
.header("User-Agent", "ProxyVerifier")
|
||||
.build();
|
||||
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
if (!response.isSuccessful()) {
|
||||
System.out.println("Request failed with code: " + response.code());
|
||||
return false;
|
||||
}
|
||||
|
||||
String responseBody = response.body().string();
|
||||
System.out.println("Response from proxy: " + responseBody);
|
||||
|
||||
// 可在此根据 IP 做进一步验证,例如是否与本地 IP 不同
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
System.out.println("Proxy error: " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String proxyIp = "127.0.0.1";
|
||||
int proxyPort = 7897;
|
||||
|
||||
boolean result = isProxyEffective(
|
||||
new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyIp, proxyPort)), true);
|
||||
System.out.println("Proxy is usable: " + result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user