java中设置网络代理

代理服务器概述

许多系统通过代理服务器访问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. 配置代理协议和端口

Paste_Image.png

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

Paste_Image.png

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();
}

运行结果:

Paste_Image.png

从请求结果中可发现,服务器获取的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项。

Paste_Image.png

从图中可以看出代理认证方式是使用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();
}

运行输出的结果如下:

Paste_Image.png

参照官方文档


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏lzj_learn_note

Volley源码分析学习

2)根据SDK版本来创建HttpStack的实现,如果是2.3以上的,则使用基于HttpUrlConnection实现的HurlStack,反之,则利用Http...

1176
来自专栏大内老A

[WCF REST] 通过ASP.NET Output Caching实现声明式缓存

ASP.NET的输出缓存(Output Caching)机制允许我们针对整个Web页面或者页面的某个部分(主要针对用户控件)最终呈现的HTML进行缓存。对于后续...

1916
来自专栏一“技”之长

iOS开发之CFNetwork框架使用 原

    在iOS应用开发中,CFNetwork框架其实并不是非常常用的,相对NSURLSession框架而言,这是一个相对底层的网络工作框架。官方文档中的下图描...

3874
来自专栏程序员八阿哥

Python从入门到摔门(6):Python Web服务器Tornado使用小结

举例来说,假设某个银行网站有这样的 URL: http://bank.example.com/withdraw?amount=1000000&for=Eve ...

2142
来自专栏移动端开发

iOS 从实际出发理解多线程

前言 ----       多线程很多开发者多多少少相信也都有了解,以前有些东西理解的不是很透,慢慢的积累之后,这方面的东西也需要自己好好的总结一下。多线程从我...

2177
来自专栏魏琼东

分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

     在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于...

1190
来自专栏iOS技术杂谈

iOS多线程——你要知道的GCD都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里 转载请注明出处 https://cloud.tencent.co...

50010
来自专栏冷冷

【springboot】 springboot 整合mybatis-plus

springboot整和mybatis-plus 整合步骤 1.pom.xml 添加mp依赖 <!-- mybatis-plus begin --> <depe...

4869
来自专栏雨过天晴

转 PHP-redis编译成功

1783
来自专栏滕先生的博客

GCD 概念解释方法:

36613

扫码关注云+社区

领取腾讯云代金券