作者:手机用户2502927615 | 来源:互联网 | 2023-10-10 14:10
在Java的网络编程中,有时候内网服务器需要访问外网的网络资源,这时候就需要使用代理。
设置代理(Proxy)可以有两种方式:
1.通过设置系统属性(System.setPropery(String key, String value)的方式
可以使用其中的http.proxyHost,http.proxyPort这两个属性,分别设置代理服务器地址和代理端口。
1 2 3 | System.setProperty( "http.proxyHost" , "www.proxy.com" );
System.setProperty( "http.proxyPort" , "8080" );
|
替换上面的代理服务器地址或IP地址,以及相应的端口为真实端口,Http连接就可以工作了。需要注意的是如果你设置了这些属性,那么所有的Http请求都会通过代理服务器。
这些属性是JVM级别的,设置了以后对所有的同类请求都有效。
如果你的代理服务器不需要验证,那到此就结束了。但一般都是需要验证的。但是你要是看了上面Java支持的属性列表,你就会发现那里面并没有期望中的
这两个属性。 这时就需要java.net.Authenticator类来完成一般的Http验证。
http.proxyUserName=username
http.proxyPassword=password
但是java.net.Authenticator这个类却是个抽象类,我们要使用还需要实例化一下子自己的类。如下
public class BasicAuthenticator extends Authenticator {
String userName;
String password; public BasicAuthenticator(String userName, String password) {
this.userName = userName;
this.password = password;
}
/**
* Called when password authorization is needed. Subclasses should
* override the default implementation, which returns null.
*
* @return The PasswordAuthentication collected from the
* user, or null if none is provided.
*/
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password.toCharArray());
}
}
我们需要覆盖java.net.Authenticator类的getPasswordAuthentication()方法,并返回一个PasswordAuthentication实例。要使他起作用,还需要设置
Authenticator.setDefault(new BasicAuthenticator(userName, password));
这样就提供了基于Http Basic的验证,接着就可以顺畅的使用需要验证的代理了。
举个例子:
Properties prop = System.getProperties();// 设置http访问要使用的代理服务器的地址prop.setProperty("http.proxyHost", ip);prop.setProperty("http.proxyPort", port);// 对https也开启代理System.setProperty("https.proxyHost", ip);System.setProperty("https.proxyPort", port);//设置请求访问的地址URL url = new URL("https://blog.csdn.net/qq_33404395/article/details/80196386");URLConnection cOnnection= url.openConnection();connection.connect();InputStream inputStream = connection.getInputStream();//读取结果byte[] bytes = new byte[1024];while (inputStream.read(bytes) >= 0) {System.out.println(new String(bytes));}
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还未做验证。
举个例子:
//设置请求访问的地址URL url = new URL("https://blog.csdn.net/qq_33404395/article/details/80196386");//设置代理InetSocketAddress address = new InetSocketAddress("xx.xx.xx.xx",443);Proxy proxy = new Proxy(Proxy.Type.HTTP, address); // http 代理URLConnection cOnnection= url.openConnection(proxy);connection.connect();InputStream inputStream = connection.getInputStream();//读取结果byte[] bytes = new byte[1024];while (inputStream.read(bytes) >= 0) {System.out.println(new String(bytes));}