博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Http连接中(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)
阅读量:5286 次
发布时间:2019-06-14

本文共 2506 字,大约阅读时间需要 8 分钟。

   使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任何其他类库。所有有时候大家就直接使用它来完成一些简单(或复杂)的功能。但是你活在伟大的{print G.F.W}后面,如果你需要访问的网站被墙了,那HttpURLConnection类就会出现连接超时的错误。这时候就需要给他设置代理(Proxy)了。

      设置代理(Proxy)可以有两种方式:

      1、通过设置系统属性(System.setPropery(String key, String value)的方式

      首先你可以在这里看到。我们可以使用其中的http.proxyHost,http.proxyPort这两个属性。顾名思义,就是分别设置代理服务器地址和代理端口。

 

//在你发起Http请求之前设置一下属性 
 
 
//通知Java您要通过代理进行连接      
  
System.getProperties().put(
"proxySet"
,
"true"
);
 
        
//指定代理所在的服务器       
 
System.getProperties().put(
"proxyHost"
,
"127.0.0.1"
);
 
        
//指定代理监听的端口        
System.getProperties().put(
"proxyPort"
,
"8580"
);

  或者

System.setProperty(
"http.proxyHost"
,
"www.proxy.com"
); 
System.setProperty(
"http.proxyPort"
,
"8080"
);

  

 

      替换上面的为你的代理服务器地址或IP地址,以及相应的端口为真实端口,Http连接及可以工作了。需要注意的是如果你设置了这些属性,那么所有的Http请求都会通过代理服务器。这些属性是JVM级别的,设置了以后对所有的同类请求都有效。比如上面的是关于http的,还有关于ftp的等等。

      如果你的代理服务器不需要验证,那到此就结束了。但一般都是需要验证的。但是你要是看了上面,你就会发现那里面并没有期望中的

     

  1. http.proxyUserName=username 
  2. http.proxyPassword=password 

这两个属性。 这时就需要java.net.Authenticator类来完成一般的Http验证。但是java.net.Authenticator这个类却是个抽象类,我们要使用还需要实例化一下子自己的类。个人觉得这里很不方便。如下:

 

  1. publicclass BasicAuthenticator extends Authenticator { 
  2.     String userName; 
  3.     String password; 
  4.  
  5.     public BasicAuthenticator(String userName, String password) { 
  6.         this.userName = userName; 
  7.         this.password = password; 
  8.     } 
  9.  
  10.     /**
  11.      * Called when password authorization is needed.  Subclasses should
  12.      * override the default implementation, which returns null.
  13.      *
  14.      * @return The PasswordAuthentication collected from the
  15.      *         user, or null if none is provided.
  16.      */ 
  17.     @Override 
  18.     protected PasswordAuthentication getPasswordAuthentication() { 
  19.         returnnew PasswordAuthentication(userName, password.toCharArray()); 
  20.     } 

 

 

       我们需要覆盖java.net.Authenticator类的getPasswordAuthentication()方法,并返回一个PasswordAuthentication实例。要使他起作用,还需要设置

     

  1. Authenticator.setDefault(new BasicAuthenticator(userName, password)); 

 

      这样就提供了基于Http Basic的验证,接着就可以顺畅的使用需要验证的代理了。

      2、通过java.net.Proxy类。

      这种方式是实例化一个Proxy类提供代理服务器的信息,如端口和地址。

     

  1. Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); 
  2. URLConnection conn = url.openConnection(proxy); 

      使用代理的方式是在打开Http连接的时候同时传递一个Proxy参数。如果需要验证信息的话我们可以添加一个Http头参数来实现。

     

  1. //格式如:  "Proxy-Authorization"= "Basic Base64.encode(user:password)" 
  2. String headerKey = "Proxy-Authorization"; 
  3. String headerValue = "Basic " + Base64.encode(user+":"+password); 
  4. conn.setRequestProperty(headerKey, headerValue); 
  5.  
  6. //.......... 

 

      其中的Base64.encode(user:password)是指把用户名和密码用冒号连接起来之后使用Base64编码后的值作为值的一部分。 

      通过这种方式只影响特定的Http连接,但是需要对代码进行修改。这种方式下是否可以使用Authenticator还未做验证。

转载于:https://www.cnblogs.com/langtianya/p/4026102.html

你可能感兴趣的文章
table中checkbox选择多行
查看>>
Magento开发文档(三):Magento控制器
查看>>
性能调优攻略
查看>>
ie6解决png图片透明问题
查看>>
瞬间的永恒
查看>>
2019-8-5 考试总结
查看>>
JS中实现字符串和数组的相互转化
查看>>
web service和ejb的区别
查看>>
Windows Azure Cloud Service (29) 在Windows Azure发送邮件(下)
查看>>
微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回
查看>>
div或者p标签单行和多行超出显示省略号
查看>>
Elasticsearch 滚动重启 必读
查看>>
Hadoop基本概念
查看>>
java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹
查看>>
浅说 apache setenvif_module模块
查看>>
MySQL--数据插入
查看>>
重新学习python系列(二)? WTF?
查看>>
shell脚本统计文件中单词的个数
查看>>
SPCE061A学习笔记
查看>>
sql 函数
查看>>