Java通过网络代理访问网络

原文链接:http://www.rgagnon.com/javadetails/java-0085.html

网络属性

要通过网络代理访问网络,你需要设置如下属性:

http.proxyHost (默认值: <none>)
http.proxyPort (默认值: 80,如果http.proxyHost被指定)
http.nonProxyHosts (默认值: <none>)

也可以在通过命令行启动一个应用Java应用程序的JVM时,设置如下参数启动网络代理:

java -Dhttp.proxyHost=myproxyserver.com -Dhttp.proxyPort=80 MyJavaApp

或者在自己的Java代码中添加如下代码:

System.setProperty("http.proxyHost", "myProxyServer.com");
System.setProperty("http.proxyPort", "80");

Java1.5以后,也可以通过给openConnection()方法传递一个Java.net.Proxy类实例来启用网络代理:

//Proxy实例, 代理ip:123.0.0.1,端口号:8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("123.0.0.1", 8080));
URL url = new URL("http://www.yahoo.com");
HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy);
uc.connect();
          
String page;
StringBuffer tmp = new StringBuffer();
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
while ((line = in.readLine()) != null){
   page.append(line + "\n");
}
System.out.println(page);

这样的话,就不需要设置系统属性(system properties)了。

你也可以使用默认的PROXY作为你的网络设置。

System.setProperty("java.net.useSystemProxies", "true");
List l = null;
try {
  l = ProxySelector.getDefault().select(new URI("http://www.yahoo.com"));
}
catch (URISyntaxException e) {
  e.printStackTrace();
}
  
if (l != null) {
   for (Iterator iter = l.iterator(); iter.hasNext() {
      java.net.Proxy proxy = (java.net.Proxy) iter.next();
      System.out.println("proxy hostname : " + proxy.type());
      InetSocketAddress addr = (InetSocketAddress) proxy.address();
      if (addr == null) {
        System.out.println("No Proxy");
      } 
      else {
        System.out.println("proxy hostname : " + addr.getHostName());
        System.out.println("proxy port : " + addr.getPort());
      }
   }
}

通过传递代理:

URL url = new URL("http://internal.server.local/");
URLConnection conn = url.openConnection(Proxy.NO_PROXY);

代理与Username/Password

你可能需要定义你自己的代理服务器。

一种方案是使用HTTP代理“Proxy-Authorization”,传递一个username:password的base64编码字符串。

System.setProperty("http.proxyHost", "myProxyServer.com");
System.setProperty("http.proxyPort", "80");
URL url=new URL("http://someserver/somepage");
URLConnection uc = url.openConnection ();
String encoded = new String(Base64.base64Encode(new String("username:password").getBytes()));
uc.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
uc.connect();

  • 注意: 关于base64函数,查看这里:http://www.rgagnon.com/javadetails/java-0084.html。

下面的示例会对一个URL发起连接,但是在此之前,我们得定义我们的代理。

import java.net.*;
import java.io.*;
  
public class URLUtils {
  public static void main(String s[]) {
    URLUtils.dump("http://www.yahoo.com");
    System.out.println("**************");
    URLUtils.dump("https://www.paypal.com");
    System.out.println("**************");
  }
  
  public static void dump(String URLName){
    try {
      DataInputStream di = null;
      FileOutputStream fo = null;
      byte [] b = new byte[1];
  
      // PROXY
      System.setProperty("http.proxyHost","proxy.mydomain.local") ;
      System.setProperty("http.proxyPort", "80") ;
  
      URL u = new URL(URLName);
      HttpURLConnection con = (HttpURLConnection) u.openConnection();
      //
      // 这不是一个使用sun.misc.* class的好主意
      // Sun强烈建议,不要去使用它们
      // 因为它有可能会在未来的版本中做出修改甚至删除
      // 所以,请慎重
      sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
      String encodedUserPwd =
         encoder.encode("mydomain\\MYUSER:MYPASSWORD".getBytes());
      con.setRequestProperty
         ("Proxy-Authorization", "Basic " + encodedUserPwd);
      // PROXY ----------
  
      di = new DataInputStream(con.getInputStream());
      while(-1 != di.read(b,0,1)) {
         System.out.print(new String(b));
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

在JDK1.2中,java.net.Authenticator通常可以在需要时传递一个凭证。

public static void dump(String URLName){
  try {
    DataInputStream di = null;
    FileOutputStream fo = null;
    byte [] b = new byte[1];
  
    // PROXY
    System.setProperty("http.proxyHost","proxy.mydomain.local") ;
    System.setProperty("http.proxyPort", "80") ;
  
    Authenticator.setDefault(new Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
        return new
           PasswordAuthentication("mydomain\\username","password".toCharArray());
    }});
  
    URL u = new URL(URLName);
    HttpURLConnection con = (HttpURLConnection) u.openConnection();
    di = new DataInputStream(con.getInputStream());
    while(-1 != di.read(b,0,1)) {
       System.out.print(new String(b));
    }
  }
  catch (Exception e) {
          e.printStackTrace();
  }
}

通过传递代理

在内网环境中,你也可以通过传递一个代理服务器,然后直接访问http服务器。

http.nonProxyHosts属性表示哪些主机应该可以直接连接而不需要通过代理服务器。它的取值可以是一个主机列表,每个主机之间通过|分隔,并且还可以使用通配符(*)去匹配主机。

java.exe -Dhttp.nonProxyHosts="*.mycompany.com|*.mycompany.local|localhost" MyClass

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值