Java配置HTTP/Socks代理的简单快速上手方法

 更新时间:2023年08月31日 09:00:28   作者:公子骏  
这篇文章主要为大家介绍了Java配置HTTP/Socks代理的简单快速上手方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

在网络请求过程中,使用代理是一种常见的需求。代理服务器可以帮助我们隐藏真实的 IP 地址、加速访问速度、访问公司特定内网等等要求。在 Java 中,我们可以通过一些库或框架来实现代理的设置和使用。

但如果使用 OkHttp、HttpClient 亦或是 Retrofit 和 Feign,需要实现 Socks 协议代理都需要实现SSLSocketFactory类或ConnectionSocketFactory接口的子类,重写createSokcet方法,实现起来非常的麻烦。如果代理还需要用户名密码验证(大部分都会有),还需要实现Authenticator的子类,并通过ThreadLocal分配到请求各自的线程中,整个过程需要自己写很多代码,无比烦人。

而本文将介绍如何使用一种最简单的方法,即使用声明式 HTTP 框架 Forest,结合@HTTPProxy 和 @SocksProxy注解来发送 HTTP/HTTPS 请求,来快速实现代理功能。

Forest 的基本使用

添加 Forest 依赖

<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-spring-boot-starter</artifactId>
    <version>1.5.33</version>
</dependency>

如果您的项目不是 spring-boot 项目,请看官方文档来配置不同环境下的依赖。

先看看没有代理的情况

// 定义一个 Forest 客户端接口
public interface MyClient {
    // 当调用该方法时,会自动使用 Get 请求访问地址 https://example.com
    @Get("https://example.com")
    String getData();
}

假如https://example.com这个地址是需要通过代理才能正常访问,那么以下代码将不会成功

// 注入 Forest 客户端实例
@Resource
MyClient myClient;
... ...
// 网络请求将会失败
String data = myClient.getData();

使用 HTTP 代理

在接口上挂上@HTTPProxy接口即可

// 通过 @HTTPProxy 注解配置代理服务的地址和端口
@HTTPProxy(host = "127.0.0.1", port = "1081")
public interface MyClient {
    @Get("https://example.com")
    String getData();
}

如果代理服务需要验证

// 通过 @HTTPProxy 注解配置代理服务的地址和端口以及用户验证信息
@HTTPProxy(host = "127.0.0.1", port = "1081", username = "root", password = "123456")
public interface MyClient {
    @Get("https://example.com")
    String getData();
}

使用 Socks 代理

如果您需要连的是 Socks 协议的代理端口,那也很简单,可以用上面的方法如法炮制,只不过注解名换了一下而已

// 通过 @SocksProxy 注解配置 Socks 协议代理服务的地址和端口
@SocksProxy(host = "127.0.0.1", port = "1081")
public interface MyClient {
    @Get("https://example.com")
    String getData();
}

加上用户名密码

// 通过 @SocksProxy 注解配置 Socks 协议代理服务的地址和端口以及用户验证信息
@SocksProxy(host = "127.0.0.1", port = "1081", username = "root", password = "123456")
public interface MyClient {
    @Get("https://example.com")
    String getData();
}

全局配置

如果不想把代理的参数(host, port 等)写死在注解代码中,可以通过字符串模板来引用配置文件的属性

先在application.yml配置文件中添加以下配置(属性名可以自己随意起):

proxy:
   host: 127.0.0.1
   port: 1081
   username: root
   password: 123456

通过字符串模板在注解中进行引用

@SocksProxy(
    host = "#{proxy.host}",
    port = "#{proxy.port}",
    username = "#{proxy.username}",
    password = "#{proxy.password}"
)
public interface MyClient {
    @Get("https://example.com")
    String getData();
}

封装注解

如果您有很多接口类要配置代理,并且不想在每个接口上放这么一大坨参数,可以使用自定义注解对@HTTPProxy@SocksProxy进行封装

// 自定义一个注解 @MyProxy
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
// 将 @SockProxy 注解以及参数添加到这里
@SocksProxy(
    host = "#{proxy.host}",
    port = "#{proxy.port}",
    username = "#{proxy.username}",
    password = "#{proxy.password}"
)
public @interface MyProxy {
}

然后在需要代理的接口上挂上您自定义的@MyProxy注解就可以了

@MyProxy
public interface MyClient1 {
   @Get("https://example.com/data1")
   String getData1();
}
@MyProxy
public interface MyClient2 {
   @Get("https://example.com/data2")
   String getData2();
}

此时,MyClient1 和 MyClient2 接口的请求都会走同样的代理

非声明式方式

以上都是以声明式的方式,配合@HTTProxy以及@SocksProxy注解来完成 HTTP/Socks 代理的设置过程的。

如果不想定义接口、配置、注解等等玩意儿,那用编程式的API直接干就完了。

// 通过 HTTP 的代理发送请求
String data1 = Forest.get("https://example.com")
      .proxy(ForestProxy.http("127.0.0.1", 1081)
                .username("root")
                .password("123456"))
      .executeAsString();
// 通过 Socks 的代理发送请求
String data2 = Forest.get("https://example.com")
      .proxy(ForestProxy.socks("127.0.0.1", 1081)
                .username("root")
                .password("123456"))
      .executeAsString();

以上就是Java配置HTTP/Socks代理简单快速上手方法的详细内容,更多关于Java配置HTTP/Socks代理的资料请关注脚本之家其它相关文章!

相关文章

  • .properties文件读取及占位符${...}替换源码解析

    .properties文件读取及占位符${...}替换源码解析

    本篇文章主要介绍了.properties文件读取及占位符${...}替换源码解析的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • SpringBoot简单实现文件上传

    SpringBoot简单实现文件上传

    这篇文章主要介绍了SpringBoot简单实现文件上传,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • IDEA连接MySQL数据库的4种方法图文教程

    IDEA连接MySQL数据库的4种方法图文教程

    IDEA是一种流行的Java开发工具,可以方便地连接MySQL,这篇文章主要给大家介绍了关于IDEA连接MySQL数据库的4种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • RocketMQ生产消息与消费消息超详细讲解

    RocketMQ生产消息与消费消息超详细讲解

    这篇文章主要介绍了RocketMQ生产消息与消费消息,RocketMQ可用于以三种方式发送消息:可靠的同步、可靠的异步和单向传输。前两种消息类型是可靠的,因为无论它们是否成功发送都有响应
    2022-12-12
  • 教你Springboot如何实现图片上传

    教你Springboot如何实现图片上传

    这篇文章主要介绍了教你Springboot如何实现图片上传,首先大家明白图片上传,需要在数据库定义一个varchar类型的img字段图片字段,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Flink ExecutionGraph生成源码解析

    Flink ExecutionGraph生成源码解析

    这篇文章主要为大家介绍了Flink ExecutionGraph生成源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 使用IDEA配置Mybatis-Plus框架图文详解

    使用IDEA配置Mybatis-Plus框架图文详解

    这篇文章主要介绍了使用IDEA配置Mybatis-Plus框架,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Maven Repository 使用方法

    Maven Repository 使用方法

    对于Java开发者来说,Maven Repository是个必须掌握的网站,它可以让开发者更加方便地管理和维护 Java 项目的依赖项,同时简化了项目开发的过程,这篇文章主要介绍了Maven Repository 使用方法,需要的朋友可以参考下
    2024-02-02
  • 详解eclipse项目中.classpath文件的使用

    详解eclipse项目中.classpath文件的使用

    这篇文章主要介绍了详解eclipse项目中.classpath文件的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • ThreadPoolExecutor线程池原理及其execute方法(详解)

    ThreadPoolExecutor线程池原理及其execute方法(详解)

    下面小编就为大家带来一篇ThreadPoolExecutor线程池原理及其execute方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论