由于工作的关系,接触到了Java中使用代理的方式。这里稍微做下整理。
首先,为什么需要使用代理?的确,在常见的项目中,如果需要访问资源(如HTTP、FTP等)就直接访问了;但有些项目可能会运行在一个受限的环境,它与目标资源存在环境隔离,而需要访问资源的时候需要通过一个特定的代理来进行。最简单的代理方式就是Nginx代理,当然还有其他的代理方式,如Socks代理。
由 此文档 可知,Java中支持四种代理,分别是:
就拿HTTP代理来说,我们可以通过如下两种方式来设置HTTP代理:
下面来动手试一下。首先,我们需要一个HTTP代理。在Mac下,可以使用 brew工具 执行 brew install nginx
来安装一个nginx。安装完成后,默认的nginx配置文件路径为 /usr/local/etc/nginx/nginx.conf
,我们需要对其进行修改。
稍微解释下,在当前的场景下我们需要这个nginx作为本地Java进程的正向代理。假如Java进程中需要访问www.baidu.com ,那么Java进程会把该HTTP请求发给nginx,然后nginx再原封不动的把请求发出去。这个过程跟nginx作为反向代理不同的地方在于,反向代理收到请求后,是转给特定后端服务的,说白了就是nginx转发的host部分跟原始请求的host是不同的。
编辑 /usr/local/etc/nginx/nginx.conf
配置中的监听8080的server部分,修改为:
server { listen 8080; resolver 8.8.8.8; location / { proxy_pass http://$host$request_uri; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
相比默认配置,主要修改了两部分:
修改完配置后,直接在命令行下执行 nginx
命令运行nginx。
接下来,我们写一个简单的Java程序来使用这个nginx代理,代码如下:
public static void main(String[] args) { try { System.setProperty("http.proxyHost", "127.0.0.1"); System.setProperty("http.proxyPort", "8080"); URL url = new URL("http://www.baidu.com/"); InputStream in = url.openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); } catch (Exception ex) { ex.printStackTrace(); } }
代码中使用了System.setProperty来设置HTTP代理。当访问http://www.baidu.com 这个地址时,请求会转发到127.0.0.1:8080,也就是我们上面启动的nginx上。然后nginx再访问http://www.baidu.com ,并将结果返回给Java进程。
本地运行结果如下: