热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java使用代理Proxy访问网络

在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支持的属性列表,你就会发现那里面并没有期望中的


这两个属性。 这时就需要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));}




推荐阅读
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
  • 深入解析JVM内存模型与分配机制
    本文详细探讨了JVM内存结构的主要组成部分,包括Java虚拟机栈、Java堆、方法区等,并深入分析了HotSpot虚拟机的分代收集策略及其对不同内存区域的管理方式。 ... [详细]
  • 本文详细介绍了Android系统的四层架构,包括应用程序层、应用框架层、库与Android运行时层以及Linux内核层,并提供了如何关闭Android系统的步骤。 ... [详细]
  • Java中的引用类型详解
    本文详细介绍了Java中的引用类型,包括强引用、软引用、弱引用和虚引用的特点和应用场景。 ... [详细]
  • 解决Jenkins编译过程中ERROR: Failed to Parse POMs的问题
    在使用Jenkins进行自动化构建时,有时会遇到“ERROR: Failed to parse POMs”的错误。本文将详细分析该问题的原因,并提供有效的解决方案。 ... [详细]
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
author-avatar
手机用户2502927615
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有