java中设置网络代理

作者: jijs | 来源:发表于2017-08-09 21:06 被阅读884次

    代理服务器概述

    许多系统通过代理服务器访问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
    2. 配置认证用户、密码信息


      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

    参照官方文档


    想了解更多精彩内容请关注我的公众号

    相关文章

      网友评论

        本文标题:java中设置网络代理

        本文链接:https://www.haomeiwen.com/subject/zgyfrxtx.html