最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java配置HTTP/Socks代理的簡單快速上手方法

 更新時間:2023年08月31日 09:00:28   作者:公子駿  
這篇文章主要為大家介紹了Java配置HTTP/Socks代理的簡單快速上手方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

在網(wǎng)絡(luò)請求過程中,使用代理是一種常見的需求。代理服務(wù)器可以幫助我們隱藏真實的 IP 地址、加速訪問速度、訪問公司特定內(nèi)網(wǎng)等等要求。在 Java 中,我們可以通過一些庫或框架來實現(xiàn)代理的設(shè)置和使用。

但如果使用 OkHttp、HttpClient 亦或是 Retrofit 和 Feign,需要實現(xiàn) Socks 協(xié)議代理都需要實現(xiàn)SSLSocketFactory類或ConnectionSocketFactory接口的子類,重寫createSokcet方法,實現(xiàn)起來非常的麻煩。如果代理還需要用戶名密碼驗證(大部分都會有),還需要實現(xiàn)Authenticator的子類,并通過ThreadLocal分配到請求各自的線程中,整個過程需要自己寫很多代碼,無比煩人。

而本文將介紹如何使用一種最簡單的方法,即使用聲明式 HTTP 框架 Forest,結(jié)合@HTTPProxy 和 @SocksProxy注解來發(fā)送 HTTP/HTTPS 請求,來快速實現(xiàn)代理功能。

Forest 的基本使用

添加 Forest 依賴

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

如果您的項目不是 spring-boot 項目,請看官方文檔來配置不同環(huán)境下的依賴。

先看看沒有代理的情況

// 定義一個 Forest 客戶端接口
public interface MyClient {
    // 當調(diào)用該方法時,會自動使用 Get 請求訪問地址 https://example.com
    @Get("https://example.com")
    String getData();
}

假如https://example.com這個地址是需要通過代理才能正常訪問,那么以下代碼將不會成功

// 注入 Forest 客戶端實例
@Resource
MyClient myClient;
... ...
// 網(wǎng)絡(luò)請求將會失敗
String data = myClient.getData();

使用 HTTP 代理

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

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

如果代理服務(wù)需要驗證

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

使用 Socks 代理

如果您需要連的是 Socks 協(xié)議的代理端口,那也很簡單,可以用上面的方法如法炮制,只不過注解名換了一下而已

// 通過 @SocksProxy 注解配置 Socks 協(xié)議代理服務(wù)的地址和端口
@SocksProxy(host = "127.0.0.1", port = "1081")
public interface MyClient {
    @Get("https://example.com")
    String getData();
}

加上用戶名密碼

// 通過 @SocksProxy 注解配置 Socks 協(xié)議代理服務(wù)的地址和端口以及用戶驗證信息
@SocksProxy(host = "127.0.0.1", port = "1081", username = "root", password = "123456")
public interface MyClient {
    @Get("https://example.com")
    String getData();
}

全局配置

如果不想把代理的參數(shù)(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();
}

封裝注解

如果您有很多接口類要配置代理,并且不想在每個接口上放這么一大坨參數(shù),可以使用自定義注解對@HTTPProxy@SocksProxy進行封裝

// 自定義一個注解 @MyProxy
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
// 將 @SockProxy 注解以及參數(shù)添加到這里
@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 代理的設(shè)置過程的。

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

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

以上就是Java配置HTTP/Socks代理簡單快速上手方法的詳細內(nèi)容,更多關(guān)于Java配置HTTP/Socks代理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • spring.mvc.servlet.load-on-startup屬性方法源碼解讀

    spring.mvc.servlet.load-on-startup屬性方法源碼解讀

    這篇文章主要介紹了spring.mvc.servlet.load-on-startup的屬性方法源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 基于kafka實現(xiàn)Spring Cloud Bus消息總線

    基于kafka實現(xiàn)Spring Cloud Bus消息總線

    消息總線是一種通信工具,可以在機器之間互相傳輸消息、文件等,這篇文章主要介紹了如何利用kafka實現(xiàn)SpringCloud Bus消息總線,感興趣的可以學(xué)習(xí)一下
    2022-04-04
  • Spring與Struts整合之使用自動裝配操作示例

    Spring與Struts整合之使用自動裝配操作示例

    這篇文章主要介紹了Spring與Struts整合之使用自動裝配操作,結(jié)合實例形式詳細分析了Spring與Struts整合使用自動裝配具體操作步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2020-01-01
  • Java父類繼承中的static和final用法

    Java父類繼承中的static和final用法

    這篇文章主要介紹了Java父類繼承中的static和final用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Spring事務(wù)的開啟原理詳解

    Spring事務(wù)的開啟原理詳解

    這篇文章主要介紹了Spring事務(wù)的簡單實現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用spring,感興趣的朋友可以了解下
    2021-03-03
  • Springboot中使用攔截器、過濾器、監(jiān)聽器的流程分析

    Springboot中使用攔截器、過濾器、監(jiān)聽器的流程分析

    Javaweb三大組件:servlet、Filter(過濾器)、?Listener(監(jiān)聽器),這篇文章主要介紹了Springboot中使用攔截器、過濾器、監(jiān)聽器的流程分析,感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • 詳解Java中的reactive stream協(xié)議

    詳解Java中的reactive stream協(xié)議

    Stream大家應(yīng)該都很熟悉了,java8中為所有的集合類都引入了Stream的概念。優(yōu)雅的鏈式操作,流式處理邏輯,相信用過的人都會愛不釋手。本文將詳細介紹Java中的reactive stream協(xié)議。
    2021-06-06
  • Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫的操作

    Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫的操作

    這篇文章主要介紹了Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)

    Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)

    這篇文章主要為大家介紹了一個Java工具類,可以實現(xiàn)Java公用實體類轉(zhuǎn)Tree結(jié)構(gòu),文中的示例代碼簡潔易懂,感興趣的小伙伴可以參考一下
    2024-10-10
  • java String校招面試題過程詳解

    java String校招面試題過程詳解

    這篇文章主要介紹了java String校招面試題過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論

娄底市| 梁平县| 龙州县| 龙游县| 琼中| 泸水县| 磴口县| 本溪市| 扶沟县| 周至县| 吉隆县| 留坝县| 桃江县| 呈贡县| 壤塘县| 象山县| 平潭县| 海丰县| 开封县| 来凤县| 镇宁| 长宁县| 西昌市| 镇赉县| 江油市| 从化市| 丽水市| 崇文区| 越西县| 康平县| 荆州市| 四川省| 岳普湖县| 大化| 韩城市| 阳城县| 望奎县| 宜川县| 海原县| 芦溪县| 千阳县|