背景

最近在项目工程实施的过程中,需要使项目可以获取一些信息,于是想到如何通过代理获取。

问题点

  1. 如何能够使所有的web请求的时候都走代理呢?

解决过程

  1. 能否让自己的所有软件都走代理?
    -可行,只要软件可以设置代理。
  2. 如果1可行,是否可以让Intellij走代理?
    -可行,但是无法让Web工程全部走代理。
  3. 既然2不可行,能否让JVM走代理。
    -不知道,没找到方案。
  4. 那是否可以让HTTP请求走代理?
    -可行,在创建RestTemplate对象的时候设置Proxy
  5. WebSocket是否可行?
    -可行,在创建WebSocket的时候设置Proxy即可。

代码

根据4,5点,可以在创建RestTemplate对象和WebSocketClient对象时候,设置代理即可。
以下的MyRestApi继承了RestTemplate父类,在构造对象的时候设置了代理。本地代理使用的是SOCK5协议,所以在获取Proxy的时候,使用的是SOCKS。在Prxoy类中,默认情况下使用的是直连,即DIRECT,而此处用的是SOCKS,如果你的有设置HTTP代理,代码中使用HTTP应该也可以。

HTTP请求

1
2
3
4
5
6
7
8
public MyRestApi() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
Proxy proxy = ProxyUtil.getProxy();
factory.setProxy(proxy);
factory.setConnectTimeout(3000);
factory.setReadTimeout(3000);
super.setRequestFactory(factory);
}
1
2
3
4
5
6
7
public class ProxyUtil {
@NotNull
public static Proxy getProxy() {
return new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1234));
}
}
此处1234是SOCKS的代理端口。

WebSocket

1
2
3
4
public MyWebSocketApiBase(String uri, BaseGateway gateway) throws URISyntaxException {
super(new URI(uri), new Draft_6455());
super.setProxy(ProxyUtil.getProxy());
}