分享java中设置代理的两种方式

1 前言

有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http、https、ftp、socks代理。比如在IE浏览器设置代理。

那我们在我们的java程序中使用代理呢,有如下两种方式。直接上代码.

2 采用设置系统属性

import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.util.Properties;

public class ProxyDemo1 {
  public static void main(String[] args) {
    Properties prop = System.getProperties();
    // 设置http访问要使用的代理服务器的地址
    prop.setProperty("http.proxyHost", "183.45.78.31");
    // 设置http访问要使用的代理服务器的端口
    prop.setProperty("http.proxyPort", "8080");
    // 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔
    prop.setProperty("http.nonProxyHosts", "localhost|192.168.0.*");
    // 设置安全访问使用的代理服务器地址与端口
    // 它没有https.nonProxyHosts属性,它按照http.nonProxyHosts 中设置的规则访问
    prop.setProperty("https.proxyHost", "183.45.78.31");
    prop.setProperty("https.proxyPort", "443");
    // 使用ftp代理服务器的主机、端口以及不需要使用ftp代理服务器的主机
    prop.setProperty("ftp.proxyHost", "183.45.78.31");
    prop.setProperty("ftp.proxyPort", "21");
    prop.setProperty("ftp.nonProxyHosts", "localhost|192.168.0.*");
    // socks代理服务器的地址与端口
    prop.setProperty("socksProxyHost", "183.45.78.31");
    prop.setProperty("socksProxyPort", "1080");
    // 设置登陆到代理服务器的用户名和密码
    Authenticator.setDefault(new MyAuthenticator("userName", "Password"));
  }

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

}

3 使用Proxy

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;

public class ProxyDemo2 {
  public static void main(String[] args) throws Exception {
    URL url = new URL("http://www.3lai8.com");
    // /创建代理服务器
    InetSocketAddress addr = new InetSocketAddress("192.168.0.254", 8080);
    // Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Socket 代理
    Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // http 代理
    Authenticator.setDefault(new MyAuthenticator("username", "password"));// 设置代理的用户和密码
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);// 设置代理访问
    InputStreamReader in = new InputStreamReader(connection.getInputStream());
    BufferedReader reader = new BufferedReader(in);
    while (true) {
      String s = reader.readLine();
      if (s != null) {
        System.out.println(s);
      }
    }
  }

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

}

4 总结

OK,就这么的简单,搞定,用第一种方式是一种全局的代理,用第种方式可以针对具体的哪一个使用代理。知道了这些我们就可以做我们想做的事情了哦!

(0)

相关推荐

  • 分享java中设置代理的两种方式

    1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式.直接上代码. 2 采用设置系统属性 import java.net.Authenticator; import java.net.PasswordAuthentication; import java.util.Properties; public class ProxyDemo1 { public

  • 浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    clone() 方法麻烦一些,需要将所有涉及到的类实现声明式接口 Cloneable,并覆盖Object类中的clone()方法,并设置作用域为public(这是为了其他类可以使用到该clone方法). 序列化的方法简单,需要将所有涉及到的类实现接口Serializable package b1ch06.clone; import java.io.Serializable; class Car implements Cloneable, Serializable { private String

  • Java中Http连接的两种方式(小结)

    在java中连接http,介绍两种方法,一种是java的HttpUrlConnection,另一种是apacha公司的httpClient,后者是第三方的类库需要从外部,导入,同时这也是第一次使用外部的类库,以后还会有很多需要导入外部类库的需求. http协议是基于tcp的一种协议. tcp是一种保证可靠连接的传输协议,通过三次握手,和丢失重传的机制保证数据的传输. 首先来看HttpUrlConnection 这个类是java自带的,直接import就行. 使用tcp连接的过程几乎都一样,htt

  • 浅析java中遍历map的两种方式

    话不多说,直奔主题,跟着小编一起往下看: 1.先将map对象转成set,然后再转为迭代器 Iterator iterator = map.entrySet().iterator(); while(iterator.hasNext()){ Entry entry = iterator.next(); System.out.println(entry.getKey()); // 获取key System.out.println(entry.getValue()); // 获取value } 2.先将

  • java 中ArrayList迭代的两种实现方法

    java 中ArrayList迭代的两种实现方法 Iterator与for语句的结合来实现,代码很简单,大家参考下. 实现代码: package cn.us; import java.util.ArrayList; import java.util.Iterator; //ArrayList迭代的两种方法 //Iterator与for语句的结合 public class Test1 { public static void main(String[] args) { ArrayList arra

  • mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 一.mybiats foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主

  • Java基于递归和循环两种方式实现未知维度集合的笛卡尔积算法示例

    本文实例讲述了Java基于递归和循环两种方式实现未知维度集合的笛卡尔积.分享给大家供大家参考,具体如下: 什么是笛卡尔积? 在数学中,两个集合X和Y的笛卡儿积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员. 假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}. 如何用程序算法实现笛卡尔积? 如果编程前已知集合的数量

  • linux服务中开启防火墙的两种方式

    存在以下两种方式: 一.service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptables:未运行防火墙. 开启防火墙: [root@centos6 ~]# service iptables start 关闭防火墙: [root@centos6 ~]# service iptables stop 二.iptables方式 先进入init.d目录,命令如下: [root@centos6 ~]# cd /etc/init.d/

  • Java中生成随机数的4种方式与区别详解

    目录 在 Java 中,生成随机数的场景有很多,所以本文我们就来盘点一下 4 种生成随机数的方式,以及它们之间的区别和每种生成方式所对应的场景. 1.Random Random 类诞生于 JDK 1.0,它产生的随机数是伪随机数,也就是有规则的随机数.Random 使用的随机算法为 linear congruential pseudorandom number generator (LGC) 线性同余法伪随机数.在随机数生成时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的

  • Java实现AOP代理的三种方式详解

    目录 1.JDK实现 2.CGLIB实现 3.boot注解实现[注意只对bean有效] 业务场景:首先你有了一个非常好的前辈无时无刻的在“教育”你.有这么一天,它叫你将它写好的一个方法进行改进测试,这时出现了功能迭代的情况.然后前辈好好“教育”你的说,不行改我的代码!改就腿打折!悲催的你有两条路可走,拿出你10年跆拳道的功夫去火拼一波然后拍拍屁股潇洒走人,要么就是悲催的开始百度...这时你会发现,我擦怎么把AOP代理这种事给忘了?[其实在我们工作中很少去手写它,但是它又是很常见的在使用(控制台日

随机推荐