欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

正文

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

但如果使用 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)絡請求將會失敗
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 協(xié)議的代理端口,那也很簡單,可以用上面的方法如法炮制,只不過注解名換了一下而已

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

加上用戶名密碼

// 通過 @SocksProxy 注解配置 Socks 協(xié)議代理服務的地址和端口以及用戶驗證信息
@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 代理的設置過程的。

如果不想定義接口、配置、注解等等玩意兒,那用編程式的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)文章

  • Java8新特性之默認方法詳解

    Java8新特性之默認方法詳解

    JAVA8 所提供的默認方法,就是在接口上你可以定義某些方法的實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Java8新特性之默認方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • 關(guān)于Spring?Boot內(nèi)存泄露排查的記錄

    關(guān)于Spring?Boot內(nèi)存泄露排查的記錄

    這篇文章主要介紹了關(guān)于Spring?Boot內(nèi)存泄露排查的記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringSecurity 自定義認證登錄的項目實踐

    SpringSecurity 自定義認證登錄的項目實踐

    本文主要介紹了SpringSecurity 自定義認證登錄的項目實踐,以手機驗證碼登錄為例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • SpringCache緩存處理詳解

    SpringCache緩存處理詳解

    這篇文章主要介紹了SpringCache緩存處理詳解,SpringCache是一個框架,實現(xiàn)了基于注解緩存功能,只需要簡單地加一個注解,就能實現(xiàn)緩存功能,需要的朋友可以參考下
    2023-09-09
  • Java運行Jar包內(nèi)存配置的操作

    Java運行Jar包內(nèi)存配置的操作

    這篇文章主要介紹了Java運行Jar包內(nèi)存配置的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • java 將jsonarray 轉(zhuǎn)化為對應鍵值的jsonobject方法

    java 將jsonarray 轉(zhuǎn)化為對應鍵值的jsonobject方法

    下面小編就為大家分享一篇java 將jsonarray 轉(zhuǎn)化為對應鍵值的jsonobject方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Java中接口的深入詳解

    Java中接口的深入詳解

    在Java語言中,接口由類來實現(xiàn)以便使用接口中的方法,這篇文章主要給大家介紹了關(guān)于Java中接口的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • springcloud 熔斷監(jiān)控Hystrix Dashboard和Turbine

    springcloud 熔斷監(jiān)控Hystrix Dashboard和Turbine

    這篇文章主要介紹了springcloud 熔斷監(jiān)控Hystrix Dashboard和Turbine,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • spring-boot整合ehcache實現(xiàn)緩存機制的方法

    spring-boot整合ehcache實現(xiàn)緩存機制的方法

    spring-boot是一個快速的集成框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。這篇文章主要介紹了spring-boot整合ehcache實現(xiàn)緩存機制,需要的朋友可以參考下
    2018-01-01
  • 基于maven的springboot的"過時"用法解析

    基于maven的springboot的"過時"用法解析

    這篇文章主要為大家介紹了基于maven的springboot"過時"用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09

最新評論