Java Http连接中(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)

使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任何其他类库。所有有时候大家就直接使用它来完成一些简单(或复杂)的功能。但是你活在伟大的{print G.F.W}后面,如果你需要访问的网站被墙了,那HttpURLConnection类就会出现连接超时的错误。这时候就需要给他设置代理(Proxy)了。

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

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

首先你可以在这里看到Java支持的属性。我们可以使用其中的http.proxyHost,http.proxyPort这两个属性。顾名思义,就是分别设置代理服务器地址和代理端口。

//在你发起Http请求之前设置一下属性 

 //通知Java您要通过代理进行连接      

  System.getProperties().put("proxySet", "true");

        //指定代理所在的服务器       

 System.getProperties().put("proxyHost", "127.0.0.1");

        //指定代理监听的端口        

System.getProperties().put("proxyPort", "8580");

  或者

System.setProperty("http.proxyHost", "www.proxy.com"); 

System.setProperty("http.proxyPort", "8080");

  

替换上面的www.proxy.com为你的代理服务器地址或IP地址,以及相应的端口为真实端口,Http连接及可以工作了。需要注意的是如果你设置了这些属性,那么所有的Http请求都会通过代理服务器。这些属性是JVM级别的,设置了以后对所有的同类请求都有效。比如上面的是关于http的,还有关于ftp的等等。

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

  1. http.proxyUserName=username
  2. http.proxyPassword=password

这两个属性。 这时就需要java.net.Authenticator类来完成一般的Http验证。但是java.net.Authenticator这个类却是个抽象类,我们要使用还需要实例化一下子自己的类。个人觉得这里很不方便。如下:

  1. publicclass BasicAuthenticator extends Authenticator {
  2. String userName;
  3. String password;
  4. public BasicAuthenticator(String userName, String password) {
  5. this.userName = userName;
  6. this.password = password;
  7. }
  8. /**
  9. * Called when password authorization is needed.  Subclasses should
  10. * override the default implementation, which returns null.
  11. *
  12. * @return The PasswordAuthentication collected from the
  13. *         user, or null if none is provided.
  14. */
  15. @Override
  16. protected PasswordAuthentication getPasswordAuthentication() {
  17. returnnew PasswordAuthentication(userName, password.toCharArray());
  18. }
  19. }

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

  1. Authenticator.setDefault(new BasicAuthenticator(userName, password));

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

2、通过java.net.Proxy类。

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

  1. Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
  2. URLConnection conn = url.openConnection(proxy);

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

  1. //格式如:  "Proxy-Authorization"= "Basic Base64.encode(user:password)"
  2. String headerKey = "Proxy-Authorization";
  3. String headerValue = "Basic " + Base64.encode(user+":"+password);
  4. conn.setRequestProperty(headerKey, headerValue);
  5. //..........

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

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

时间: 2024-07-29 22:33:29

Java Http连接中(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)的相关文章

Java网络连接之HttpURLConnection、HttpsURLConnection

工具类包含两个方法: http请求.https请求 直接看代码: package com.jtools; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ConnectException; import java.net.HttpURLConnection; import

JAVA HTTP连接(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)

public static void main(String[] args) { // TODO Auto-generated method stub try { URL url = new URL("http://www.baidu.com"); // 创建代理服务器 InetSocketAddress addr = new InetSocketAddress("172.21.1.8",80); Proxy proxy = new Proxy(Proxy.Type

C#中给WebClient添加代理Proxy

效果图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Text; using System.Windows.Forms; namespace TestProxy { public partial class

[Z]Java Http连接中(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)

Dom4j 处理webservice,提交方法没有设置代理,导致取不到数据 http://blog.csdn.net/chennxi/article/details/7034645 From http://blog.csdn.net/redhat456/article/details/6149774 使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任何其他类库. 所有有时候大家就直接使用它来完成一些简单(或复杂)的功能.但是你活在伟大的{prin

Java中两种动态代理的实现

本文介绍了java中两种动态代理的实现方法,Spring的动态代理也是基于这两种方法的.直接附上源码: 1.JDK实现 使用JDK实现动态代理必须使用接口 接口Work.java public interface Work { public void work(); } 实现类WorkImpl.java public class WorkImpl implements Work { @Override public void work() { System.out.println("我在工作&q

详解 Java 中的三种代理模式

代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.      这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法.      举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎

java如何连接到数据库以及如何在数据库中插入变量

1. 加载驱动: 导入数据库连接jar包,在工程目录中创建lib文件夹,将下载好的JDBC放到该文件夹下,如下图所示: 2. 添加JDBC: 右键工程名,在java build path中的Libraries分页中选择Add JARs...,选择刚才添加的JDBC,如下图: JDBC连接数据库的步骤 1. 导入驱动jar包 * 复制mysql-connector-java-5.1.37-bin.jar到项目的lib文件夹下 * 右键->add as Library… 2. 注册驱动 3. 获取数

详解 Java 中的三种代理模式!

作者:岑宇 https://www.cnblogs.com/cenyu/p/6289209.html 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法. 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的

Java 反射在实际开发中的应用

运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 本篇博文会结合Thinking in Java 的demo 和实际开发中碰到的例子,对Java反射和获取类型信息做总体上整理.文章主要分为三块: Java类加载和初始化 Java中RTTI Java利用反射获取运行时类型信息 一:Java类加载和初始