天天看点

Java使用代理Proxy访问网络及其验证

在java的网络编程中,有时候内网服务器需要访问外网的网络资源,这时候就需要使用代理。

设置代理(proxy)可以有两种方式:

1.通过设置系统属性(system.setpropery(string key, string value)的方式

可以使用其中的http.proxyhost,http.proxyport这两个属性,分别设置代理服务器地址和代理端口。

1

2

3

<code>//在你发起http请求之前设置一下属性</code>

<code>system.setproperty(</code><code>"http.proxyhost"</code><code>, </code><code>"www.proxy.com"</code><code>);</code>

<code>system.setproperty(</code><code>"http.proxyport"</code><code>, </code><code>"8080"</code><code>);</code>

  

替换上面的代理服务器地址或ip地址,以及相应的端口为真实端口,http连接就可以工作了。需要注意的是如果你设置了这些属性,那么所有的http请求都会通过代理服务器。

这些属性是jvm级别的,设置了以后对所有的同类请求都有效。

如果你的代理服务器不需要验证,那到此就结束了。但一般都是需要验证的。但是你要是看了上面java支持的属性列表,你就会发现那里面并没有期望中的

http.proxyusername=username 

http.proxypassword=password 

这两个属性。 这时就需要java.net.authenticator类来完成一般的http验证。

但是java.net.authenticator这个类却是个抽象类,我们要使用还需要实例化一下子自己的类。如下

Java使用代理Proxy访问网络及其验证
Java使用代理Proxy访问网络及其验证
Java使用代理Proxy访问网络及其验证
Java使用代理Proxy访问网络及其验证

我们需要覆盖java.net.authenticator类的getpasswordauthentication()方法,并返回一个passwordauthentication实例。要使他起作用,还需要设置

authenticator.setdefault(new basicauthenticator(username, password)); 

这样就提供了基于http basic的验证,接着就可以顺畅的使用需要验证的代理了。

2.通过java.net.proxy类

这种方式是实例化一个proxy类提供代理服务器的信息,如端口和地址。

proxy proxy = new proxy(proxy.type.http, new inetsocketaddress(host, port)); 

urlconnection conn = url.openconnection(proxy); 

使用代理的方式是在打开http连接的时候同时传递一个proxy参数。如果需要验证信息的话我们可以添加一个http头参数来实现。

//格式如下: 

"proxy-authorization"= "basic base64.encode(user:password)" 

string headerkey = "proxy-authorization"; 

string headervalue = "basic " + base64.encode(user+":"+password); 

conn.setrequestproperty(headerkey, headervalue); 

//.......... 

其中的base64.encode(user:password)是指把用户名和密码用冒号连接起来之后使用base64编码后的值作为值的一部分。

通过这种方式只影响特定的http连接,但是需要对代码进行修改。这种方式下是否可以使用authenticator还未做验证。