java中设置网络代理
来源:互联网 发布:centos 6.8 搭建lnmp 编辑:程序博客网 时间:2024/06/06 13:25
代理服务器概述
许多系统通过代理服务器访问Web,有时还会访问Internet的其它非HTTP部分。代理服务器接收到本地客户端到远程服务器的请求。代理服务器向远程服务器发出请求,再将结果转发回本地客户端。
代理服务器作用:
1.防止攻击
隐藏自己的真实地址信息,还可隐藏自己的IP,防止被黑客攻击。
2.缓存
把经常访问的一些文档、页面缓存到代理服务器上,这样,可以减少访问从远程服务器上下载文档、页面。
3.限制出站连接
例如:公司会使用代理服务器配置一些网址,阻止访问外网(购物网站等)。
…
java中配置代理
java中支持 HTTP代理、HTTPS代理、Socket代理、FTP代理 等。
HTTP
http.proxyHost
http.proxyPort [默认值:80]
http.nonProxyHostsHTTPS
https.proxyHost
https.proxyPort [默认值:443]
https.nonProxyHostsFTP
ftp.proxyHost
ftp.proxyPort [默认值:80]
ftp.nonProxyHostsSOCKS
socksProxyHost
socksProxyPort [默认值:1080]
下面我们以HTTP代理来说明java中支持代理实现的几种方式
搭建代理服务器
这里使用的是CCProxy搭建的代理服务器。
配置代理协议和端口
配置认证用户、密码信息
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中设置网络代理
- java 设置代理网络
- 在java程序中设置http代理访问网络
- ubuntu中apt-get设置网络代理
- 虚拟机中Centos7设置网络代理
- java 开发设置网络全局代理
- Java 设置代理IP 访问网络
- Ubuntu设置网络代理
- ubuntu网络代理设置
- ubuntu网络代理设置
- ubuntu 设置网络代理
- 浏览器设置网络代理
- msys2设置网络代理
- linux 网络代理设置
- eclipse网络代理设置
- notepad++设置网络代理
- Docker网络代理设置
- 网络偏好代理设置
- leetcode 198. House Robber | 动态规划
- 递归和非递归分别实现求n的阶乘
- 实现自己的strcpy和memcpy
- epoll源码剖析
- 二叉搜索树
- java中设置网络代理
- poj 2417 Discrete Logging
- python中的多线程-threading
- HDU 6106 Classes【简单思维】
- Hibernate 使用HQL方法进行模糊查询(3张表联合查询)
- HEVC评测
- Python基础总结(5)
- 寻找多数元素(主元素)
- POJ3461