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

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

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

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

//在你发起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还未做验证。

Java使用代理Proxy访问网络及其验证的更多相关文章

  1. java动态代理Proxy

    package com.gz_06; public interface StudentDao { public void login(); public void regist(); } packag ...

  2. java 动态代理 Proxy.newProxyInstance 使用心法

    使用JDk的Proxy类的静态方法newProxyInstance ,让JVM自动生成一个新的类,类中包含了inerfaces参数中的所有方法,每个方法都调用h.invoke 方法       AOP ...

  3. java动态代理--proxy&cglib

    大纲 代理 proxy cglib 小结 一.代理 为什么要用代理?其实就是希望不修改对象的情况下,增强对象. 静态代理: 静态代理模式,需要代理类和目标类实现同一接口,代理类的方法调用目标类的方法, ...

  4. Java 实现代理(Proxy)模式

    类图 /** * 游戏者接口 * @author stone * */ public interface IGamePlayer { // 登录游戏 public void login(String ...

  5. 解决CentOS内网机通过Windows下架设代理来访问网络

    新分配的CentOS运行在内网环境下,无法连接Internet,为了能够使用yum部署OpenVas工具,需要在内网下一台Windows主机架设代理,作代理服务器来令虚拟机上网. 代理服务器选择了CC ...

  6. 使用代理IP访问网络

    现在很多领域都需要用到代理IP,用到的领域越来越广,如爬虫.投票.抢购等等. 代理IP免费获取地址:http://www.xicidaili.com/(少部分可以用) 我这个案例使用的上面地址里面的免 ...

  7. Java程序通过代理访问网络

    问题背景 最近工作上有开发爬虫的任务,对目标网站数据进行抓取,由于大部分网站都在国外,无法直接访问,需要通过代理才能登录.爬虫部署的服务器在香港,所以爬虫部署到服务器后,是可以访问目标网站的,但本地开 ...

  8. java动态代理——代理方法的假设和验证及Proxy源码分析五

    前文地址 https://www.cnblogs.com/tera/p/13419025.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

  9. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

随机推荐

  1. linux:Nginx+https双向验证(数字安全证书)

    本文由邓亚运提供 Nginx+https双向验证 说明: 要想实现nginx的https,nginx必须启用http_ssl模块:在编译时加上--with-http_ssl_module参数就ok.另 ...

  2. ecshop后台导航修改教程说明

    ecshop后台导航修改教程说明 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2014-06-25   需要操作的文件为: 1.修改admin\includes\in ...

  3. java操作MySQL数据事务的简单学习

    在执行数据更改操作前使用数据库连接对象调用setAutoCommit方法(conn.setAutoCommit(false)),其参数true或false区别: true:sql命令的提交(commi ...

  4. centos 搭建gitlab

    #修改yum源 yum -y install wget cd /etc/yum.repos.d wget -O CentOS-Base.repo http://mirrors.aliyun.com/r ...

  5. Linux 下源码包安装MariaDB

    .8.5]# cd cmake-2.8.5 [root@zabbix_server cmake-2.8.5]# ./bootstrap [root@zabbix_server cmake-2.8.5] ...

  6. Android Studio-导入External Libraries

    1.导入本地Libraries 1 拷贝 gson-2.3.1.jar(gson-2.3.1.jar为例)到 app/libs 目录下 2 在app/build.gradle的 dependencie ...

  7. Java-java中的有符号,无符号操作以及DataInputStream

    1. 无符号和有符号 计算机中用补码表示负数,并且有一定的计算方式:另外,用二进制的最高位表示符号,0表示正数.1表示负数.这种说法本身没错,可是要有一定的解释,不然它就是错的,至少不能解释,为什么字 ...

  8. 腾讯sdk学到了

    1. 获取文本的高度和宽度 + (CGFloat)heightForContent:(MyMsgTextModel *)content withWidth:(CGFloat)width { CGSiz ...

  9. WPF 样式和行为

    样式(style):组织和重用格式化选项的重要工具,将细节如边距.字体.字号等信息封装起来,然后再需要的地方通过属性来应用样式. 行为(behavior):封装一些通用的UI行为,如拖动,缩放元素的代 ...

  10. myeclipse2014集成SVN

    团队合作的项目肯定少不了版本控制,那么现在就看看myeclispe中是如何使用的吧. 开发环境:myeclipse 2014   java 8 tomcate 8 试了网上说的几种方法,都没有成功,最 ...