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)文章
關(guān)于Spring?Boot內(nèi)存泄露排查的記錄
這篇文章主要介紹了關(guān)于Spring?Boot內(nèi)存泄露排查的記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06java 將jsonarray 轉(zhuǎn)化為對應鍵值的jsonobject方法
下面小編就為大家分享一篇java 將jsonarray 轉(zhuǎn)化為對應鍵值的jsonobject方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03springcloud 熔斷監(jiān)控Hystrix Dashboard和Turbine
這篇文章主要介紹了springcloud 熔斷監(jiān)控Hystrix Dashboard和Turbine,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08spring-boot整合ehcache實現(xiàn)緩存機制的方法
spring-boot是一個快速的集成框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。這篇文章主要介紹了spring-boot整合ehcache實現(xiàn)緩存機制,需要的朋友可以參考下2018-01-01