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

简介:

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

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

1.通过设置系统属性(System.setPropery(String key, String value)的方式

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

1
2
3
//在你发起Http请求之前设置一下属性
System.setProperty( "http.proxyHost" "www.proxy.com" );
System.setProperty( "http.proxyPort" "8080" );

  

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

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

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

http.proxyUserName=username 
http.proxyPassword=password 
这两个属性。 这时就需要java.net.Authenticator类来完成一般的Http验证。

但是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的验证,接着就可以顺畅的使用需要验证的代理了。

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还未做验证。


目录
相关文章
|
15天前
|
Java Python
设置代理ip——java
设置代理ip——java
|
14天前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
28 11
SoapUI 访问代理设置
SoapUI 访问代理设置
133 0
|
Java 数据安全/隐私保护
Java 和 HTTP 的那些事(三) 代理认证
Java 和 HTTP 的那些事(三) 代理认证
538 0
Java 和 HTTP 的那些事(三) 代理认证
|
设计模式 Java 数据库连接
Java 中创建代理的几种方式
代理模式 设计模式最初由 GOF 在《设计模式》一书中总结,将其划分为创建型、结构型、行为型三大类。其中结构型模式总结了一些将类或对象组合在一起的经典结构。
248 0
Java HttpClient 如何使用代理IP请求接口
Java HttpClient 如何使用代理IP请求接口
如何使用花刺代理验证快速设置http代理
下面教大家如何使用花刺代理验证,使用软件快速改变上网ip地址;
如何使用花刺代理验证快速设置http代理
|
Java Spring API