使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任何其他类库。但是,如果你需要访问的网站被墙了,那HttpURLConnection类就会出现连接超时的错误。这时候就需要给他设置代理(Proxy)了。
设置代理(Proxy)可以有两种方式:
1、通过设置系统属性(System.setPropery(String key, String value)的方式
首先你可以在这里看到Java支持的属性。我们可以使用其中的http.proxyHost,http.proxyPort这两个属性。顾名思义,就是分别设置代理服务器地址和代理端口。
// 在你发起Http请求之前设置一下属性 System.setProperty("http.proxyHost", "www.proxy.com"); System.setProperty("http.proxyPort", "8080");
替换上面的www.proxy.com为你的代理服务器地址或IP地址,以及相应的端口为真实端口,Http连接及可以工作了。需要注意的是如果你设置了这些属性,那么所有的Http请求都会通过代理服务器。这些属性是JVM级别的,设置了以后对所有的同类请求都有效。比如上面的是关于http的,还有关于ftp的等等。
如果你的代理服务器不需要验证,那到此就结束了。但一般都是需要验证的。但是你要是看了上面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还未做验证。
http://blog.csdn.net/u013782203/article/details/51790460
相关推荐
JAVA 通过proxy代理方式访问internet资源,
Java提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...
本文将详细讲解如何利用Java来获取浏览器的代理设置,并结合提供的文件`registry.jar`和`ICE_JNIRegistry.dll`来探讨可能的实现方式。 首先,Java中的`java.net.ProxySelector`类是用于选择网络连接所使用的代理...
Java动态代理是基于Java反射机制的一种实现方式,它允许我们在运行时动态地创建一个实现了某些接口的新类。Java动态代理主要用于创建代理对象,这些代理对象可以实现在特定时刻的行为增强。 **1. Java动态代理类的...
在命令行运行 Java 程序时,可以在命令行参数中设置代理: ```bash java -Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=8080 MyApplication ``` 其中 `-D` 参数用于设置系统属性,`http.proxyHost` 和 `...
Java代理是一种在运行时增强或拦截对象方法调用的技术,它可以让我们在不修改原有代码的情况下,为类添加新的功能或行为。在Java中,代理主要分为两种:静态代理和动态代理。静态代理是通过手动创建代理类来实现的,...
6. **代理服务器配置和缓存**:高级的代理服务器可能需要支持代理设置(如端口、认证等)和缓存功能。缓存可以减少网络延迟,提高性能,但需要处理好缓存更新和过期策略。 7. **第三方库**:有一些开源的Java库可以...
Java代理机制是Java编程中一个重要的特性,它允许我们在不修改...选择哪种代理方式取决于具体需求,如果目标类实现了接口,优先考虑JDK动态代理;如果目标类没有接口或者需要更灵活的代理方式,则可以使用CGLIB代理。
Java动态代理是Java编程中的一种重要技术,它允许...对于那些没有接口或者对性能有较高要求的场景,CGLIB通常是首选的动态代理实现方式。在实际开发中,了解并掌握CGLIB的使用,将有助于提升代码的可扩展性和维护性。
本文将深入探讨如何在Java中设置和使用LAN代理服务器。 首先,了解Java中的网络编程基础是必要的。Java提供了`java.net`包,其中包含用于创建和管理网络连接的类和接口。例如,`Socket`和`ServerSocket`用于TCP连接...
在IT行业中,网络编程是不可或缺的一部分,而代理服务器在数据通信、网络安全以及多线程爬虫等场景下扮演着重要角色。...通过这种方式,开发者可以快速集成到自己的项目中,实现Java应用对IE代理设置的动态获取和使用。
在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...
在附件的"demo"中,可能包含了这两个代理方式的示例代码,包括如何创建和使用代理对象,以及如何在`InvocationHandler`或`MethodInterceptor`中添加自定义逻辑。通过阅读和理解这些代码,你可以更深入地了解Java动态...
总结来说,Java动态代理为我们提供了一种灵活的方式,可以在运行时扩展或改变对象的行为,无需修改原有代码。JDK动态代理适用于目标对象实现了接口的情况,而CGLIB则适用于未实现接口的目标类。理解并熟练运用这两种...
Java Socket 编写的上网代理是一种基于TCP/IP协议的网络通信方式,它允许应用程序通过Socket连接到其他网络服务,实现数据的传输。在这个特定的项目中,开发者使用Java语言实现了代理服务器的功能,允许用户通过该...
Java中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK动态代理是基于接口的,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。...
代理模式是一种设计模式,它在Java中可以通过两种方式实现:静态代理和动态代理。静态代理是通过编写一个代理类来实现接口,代理类在编译时就已经确定。而动态代理则是在运行时动态生成代理类,通常使用`java.lang....
在Java中,基于动态代理和反射机制实现ORM可以提高代码的可维护性和灵活性。本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和...
Java中的代理模式是一种设计模式,它允许我们创建一个代理对象来代表另一个对象,这个代理对象在调用实际对象的方法之前和之后可以添加额外的操作。...在实际开发中,根据项目需求选择合适的代理方式至关重要。