5. 代理
代理的作用:
- 出于安全原因防止远程主机了解到本地网络配置的秘密细节
- 为了通过滤出站请求,限制可以浏览的网络。
- 出于性能考虑,运行多个用户从本地缓存获取同样的一些经常访问的文档,而不是重复从远程主机下载
5.1 系统属性
没看懂
基本操作所要做的就是设置一些系统属性,指示本地代理服务器的地址。
如果使用存储的HTTP代理,则将http.proxyHost设置为代理服务器的域名或IP地址,将http.proxyPort设置为代理服务器端口(默认为80)还有一些方法包括在java代码中调用System.setProperty,或是通过启动时的-d 选项使用。
如果不需要代理,而是直接连接则要把http.nonProxyHost系统属性设置为其主机名或IP地址。
同样使用ftp协议可以通过设置ftp.proxyHost和ftp.proxyPort和ftp.nonProxyHosts属性实现
java不支持任何其他应用层协议,但是如果对所有TCP连接都使用传输层Socks代理,可以使用socksProxyHost和socksProxyPort系统属性。但是这个选项没有提供禁止代理选项。这是一个全有或全无的选择。
5.2 Proxy类
Proxy类提供粒度更细的控制。确切的说,它允许你为不同的远程主机选择不同的代理服务器。
任然只有三种代理:HTTP、SOCKS和直接连接通过,Proxy.Type的三个枚举常量来表示:
- Proxy.Type.DIRECT
- Proxy.Type.HTTP
- Proxy.Type.SOCKS
关于代理的其他重要信息包括地址和端口,用SocketAddress对象表示。
SocketAddress address = new InetSocketAddress("proxy.example.com",80);
Proxy proxy = new Proxy(Proxy.Type.HTTP,address);
上述代码创建了一个Proxy对象,表示一个http代理服务器
5.3 ProxySelector类
每个运行中的虚拟机都有一个java.net.ProxySelector类,用于确定不同连接的代理服务器。
默认的ProxySelector类只检查各种系统属性和URL协议,来决定如何连接到不同的主机。
不过你可以安装自己的ProxySelector子类来代替默认的选择器。用它根据协议、主机、路径、日期时间和其他标准来选择不同的代理。
这个类关键是抽象方法:
public abstract List<Proxy> select(URI uri)
uri表示需要连接的主机。对于Socket类生产的纯TCP连接,URI形式为:socket://host:port。
ProxySelector为这种类型对象选择正确的代理。并返回到一个List<Proxy>
中
第二个重要的抽象方法:
public void conectFailed(URI uri,SocketAddress address, IOException ex)
这是一个回调方法,用于警告程序这个代理服务器实际上没有建立连接。
由于每个虚拟机只有一个ProxySelector,因此要改变这个ProxySelector,需要把新的选择器传递给静态方法ProxySelector.setDefault(),此后虚拟机打开的所有连接都像这个ProxySelect询问将要使用的正确代理。不要在共享环境中运行这样的代码。