代理服务器概述

许多系统通过代理服务器访问Web,有时还会访问Internet的其它非HTTP部分。代理服务器接收到本地客户端到远程服务器的请求。代理服务器向远程服务器发出请求,再将结果转发回本地客户端。

代理服务器作用:

1.防止攻击
隐藏自己的真实地址信息,还可隐藏自己的IP,防止被黑客攻击。
2.缓存
把经常访问的一些文档、页面缓存到代理服务器上,这样,可以减少访问从远程服务器上下载文档、页面。
3.限制出站连接
例如:公司会使用代理服务器配置一些网址,阻止访问外网(购物网站等)。

java中配置代理

java中支持 HTTP代理、HTTPS代理、Socket代理、FTP代理 等。

  1. HTTP
    http.proxyHost
    http.proxyPort [默认值:80]
    http.nonProxyHosts

  2. HTTPS
    https.proxyHost
    https.proxyPort [默认值:443]
    https.nonProxyHosts

  3. FTP
    ftp.proxyHost
    ftp.proxyPort [默认值:80]
    ftp.nonProxyHosts

  4. SOCKS
    socksProxyHost
    socksProxyPort [默认值:1080]

下面我们以HTTP代理来说明java中支持代理实现的几种方式

搭建代理服务器

这里使用的是CCProxy搭建的代理服务器。

  1. 配置代理协议和端口

  2. 配置认证用户、密码信息

JVM参数设置代理

在系统启动时,使用-D项来设置代理。
例如:
java -Dhttp.ProxyHost=192.168.10.130 -Dhttp.ProxyPort=808 cn.com.infcn.ProxyDemo

代理的作用域:整个系统

如果代理需要用户名和密码,则需要通过Authenticator.setDefault(自定义的Authenticator) 来设置用户名密码,下面会介绍。

系统参数设置代理

在代码中通过System.setProperty设置代理:

System.setProperty("http.proxyHost", "192.168.10.130");
System.setProperty("http.proxyPort", "808");
System.setProperty("http.nonProxyHosts", "192.168.3.249 | 192.168.3.100");

代理的作用域:整个系统

使用Proxy 设置代理

代码中可以使用Proxy类给单个URL连接指定代理,使程序更加灵活的使用代理:

SocketAddress sa = new InetSocketAddress("192.168.10.130", 808);
Proxy proxy = new Proxy(Proxy.Type.HTTP, sa);URL url = new URL("http://192.168.3.249:8090/webDemo/index.jsp");
url.openConnection(proxy );

代理的作用域:指定的URL

需要认证的代理

java.net包中提供了Authenticator类,可以使用他为HTTP认证提供用户名和口令。

public abstract class Authenticator

他是个抽象类,用户需要为此类实现一个子类,来实现认证功能。

子类需要实现Authenticator类中的requestPasswordAuthentication方法

public static PasswordAuthentication requestPasswordAuthentication

当URL需要用户名和口令的时候,系统会自动调用requestPasswordAuthentication方法。

使用静态方法Authenticator.setDefault(Authenticator a)来注册自己实现的子类。

下面通过代码来演示Authenticator的使用。

public class MyAuthenticator extends Authenticator {private String user = "";private String password = "";public MyAuthenticator(String user, String password) {this.user = user;this.password = password;}protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(user, password.toCharArray());}
}public class ProxyAuthDemo{public static void main(String[] args) throws Exception {Authenticator.setDefault(new MyAuthenticator("infcn", "123456"));SocketAddress sa = new InetSocketAddress("192.168.10.130", 808);Proxy proxy = new Proxy(Proxy.Type.HTTP, sa);URL url = new URL("http://192.168.3.249:8090/webDemo/index.jsp");HttpURLConnection conn = (HttpURLConnection)url.openConnection(proxy );BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;while((line=br.readLine())!=null){System.out.println(line);}br.close();
}

运行结果:

从请求结果中可发现,服务器获取的ip是代理服务器的ip(192.168.10.130),这样就隐藏了真正访问者ip(192.168.3.249)。
本机ip :192.168.3.249
代理服务器ip : 192.168.10.130

HTTP 请求头 认证

使用注册Authenticator方式认证代理访问,然后通过抓包工具发现,请求头中多了Proxy-authorization项。

从图中可以看出代理认证方式是使用basic认证的。
basic认证是使用 “用户名:密码” 然后通过base64转码的方式。相当于明文传输的。

下面我们通过请求头中配置Proxy-authorization来认证代理。

代码如下:

public class ProxyAuthDemo{public static void main(String[] args) throws Exception {SocketAddress sa = new InetSocketAddress("192.168.10.130", 808);Proxy proxy = new Proxy(Proxy.Type.HTTP, sa);URL url = new URL("http://192.168.3.249:8090/webDemo/index.jsp");HttpURLConnection conn = (HttpURLConnection)url.openConnection(proxy );//用户名:密码  格式然后base64转码成ascii格式的(请求头不能使用非ascii的编码)String basic = Base64.getEncoder().encodeToString("infcn:123456".getBytes());conn.setRequestProperty("Proxy-authorization", "Basic " + basic);BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;while((line=br.readLine())!=null){System.out.println(line);}br.close();
}

运行输出的结果如下:

参照官方文档

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

java中设置网络代理相关推荐

  1. 学习Java第十九天(一):1、Java中的网络编程

    1.Java中的网络编程 什么是网络? 在计算机领域中网络是信息传输,接收共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 作用:信息传输,资源共享 有点:资源共享免费 O ...

  2. Java中的网络编程类(TCPUDP)

    Java中的网络编程类 n Java.net包 – TCP协议 URL URLConnection Socket ServerSocket – UDP协议 DatagramPacket Datagra ...

  3. python全局代理_Python程序中设置HTTP代理

    0x00 前言 大家对HTTP代理应该都非常熟悉,它在很多方面都有着极为广泛的应用.HTTP代理分为正向代理和反向代理两种,后者一般用于将防火墙后面的服务提供给用户访问或者进行负载均衡,典型的有Ngi ...

  4. Linux设置网络代理

    设置网络代理操作简介 设置临时代理(仅在当前shell会话生效) # export http_proxy=http://ip:port # export https_proxy=http://ip:p ...

  5. 吃透Java中的动态代理

    动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...

  6. centos 桥接配置 设置网络代理 lnmp搭建

    一.桥接配置 centos设置  编辑->虚拟网络编辑器->桥接模式->还原默认设置 虚拟机->设置->网络适配器->桥接 cd /etc/sysconfig/ne ...

  7. 电脑小米路由器设置虚拟服务器,小米路由器在Win7系统中设置网络映射教程

    小米路由器怎么在Win7系统中设置网络映射?小米路由器,自带有一个文件存储芯片,用于存储用户使用小米路由器下载的各类文件(包括电影.音乐等文件),如果需要在计算机中看到小米路由器的文件夹,则需要将小米 ...

  8. Java中如何实现代理机制(JDK、CGLIB)

    代理分为两种: 1.静态代理 2.动态代理  动态代理又分为两种:jdk 实现  :Cglib 实现 3.Java中如何实现代理机制(JDK.CGLIB) JDK动态代理:代理类和目标类实现了共同的接 ...

  9. Java中的网络支持Socket应用

    title: Java中的网络支持Socket应用 date: 2019-05-04 14:00:00 Java中的网络支持Socket应用 前言: 单机的程序终究会被淘汰的,所以还是要让你的程序软件 ...

最新文章

  1. DEDECMS教程:上/下一篇文章标题长度的截取方法
  2. 多核时代,并行编程为何“臭名昭著”?
  3. bootstrap轮播,播放到最后一张图片的时候,就不正确了。
  4. 《CCIE路由和交换认证考试指南(第5版) (第1卷)》——1.6节虚拟交换系统
  5. 计算机视觉模型、学习和推理
  6. floatmap 二维数组_Golang学习笔记(四):array、slice、map
  7. centos 6.5 php nginx,CentOS6.5上安装nginx与php5.5
  8. CentOS6上安装Flash Player
  9. Codeforces 527C Glass Carving
  10. 计算机控制的行业规模,2019年中国DCS控制系统行业市场现状及竞争格局分析,内资“两家独大”「图」...
  11. CF632E Thief in a Shop 题解
  12. Android图片分享问题采坑总结
  13. 解密阿里云安全女程序员维棠 、牵尘代码诗!
  14. learning java AWT Pannel
  15. halcon机器视觉之玩转车牌识别-超人视觉罗超
  16. 使用Python pip怎么升级pip
  17. 2016都市小说排行版前十推荐
  18. php后台开发—微信分销那点事
  19. 光耦w314的各引脚图_光电耦合器的管脚图及工作原理
  20. Oracle使用Scott用户登录

热门文章

  1. 备份一下java笔记
  2. 【苹果电脑(Macbook/Macbook Pro)查看本机IP地址和DNS地址的具体步骤】
  3. STARTING POINT TIER 2 Oopsie
  4. 1.3.2 常用内置函数
  5. idea错误: 找不到或无法加载主类 cn.itcast.user.UserApplication
  6. RPGMaker MV 入门教程
  7. iOS 判断 iPhoneXS Max、iPhoneXS、iPhoneXR、iPhoneX
  8. 2019PHP面试题大全(中级知识一)
  9. Highcharts创建条形图竞赛显示时间序列
  10. 汇编中有符号与无符号数以及CF,OF标志位的区分