java – ProxySelector将URL的方案从https://更改为socket://
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – ProxySelector将URL的方案从https://更改为socket://,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2813字,纯文字阅读大概需要5分钟。
内容图文
我需要访问Facebook,但所有传出通信都在我们的服务器上被阻止,所以我必须使用代理.
我用以下代码初始化代理:
ProxySelector.setDefault(new ConfigurableProxySelector(mapping));
代理类型是HTTP,代理主机和端口正在工作(通过简单的wget测试确认).
我正在尝试这样做:
HttpClient httpClient = new HttpClient();
HttpMethod method = new GetMethod("https://graph.facebook.com:443");
int status = httpClient.executeMethod(method);
现在,在我的类ConfigurableProxySelector中,我有select方法,我有断点:
public List<Proxy> select(URI uri) {
...
}
因此,使用HttpClient我发出一个请求,该请求应该被代理,并且代码在ConfigurableProxySelector中的select()方法中的断点处停止.
但奇怪的是,uri.scheme =“socket”和.toString()给出“socket://graph.facebook.com:443”而不是“https://graph.facebook.com:443”.
因为ProxySelector具有“https://”的映射而不是“socket://”的映射,所以它找不到它并以“Connection refused”结束.奇怪的是select()方法在执行以“Connection refused”结束之前被调用了4次.
任何帮助,将不胜感激.
解决方法:
Apache HTTP Client 3.1本身不会支持从默认ProxySelector或用户实现返回的HTTP代理.
ProxySelector的快速摘要
ProxySelector是一个服务类,它根据其方案为给定的URL选择并返回合适的代理.例如,对于http:// somehost的请求将尝试提供HTTP代理(如果已定义).可以使用系统属性在运行时配置默认的ProxySelector,例如http.proxyHost和http.proxyPort.
HttpURLConnection的
HTTPUrlConnection的一个实例将多次检查默认的ProxySelector:1st用于选择http或https,然后在构建原始tcp套接字时使用套接字方案. SOCKS代理可用于代理原始tcp套接字,但通常不在企业环境中找到,因此原始tcp套接字通常不会接收代理.
HTTP客户端3.1
另一方面,HC 3.1永远不会检查http / https方案的默认ProxySelector.但是,它将在稍后的时间点检查套接字方案,当它最终构建原始套接字时 – 这是您看到的请求.这意味着系统属性http.proxyHost和http.proxyPort无效.对于只有HTTP / HTTPS代理的大多数人来说,这显然不太理想.
要解决此问题,您有两种选择:在每个HC 3.1连接上定义代理或实现您自己的HC 3.1 HTTPConnectionManager.
HTTPConnectionManager
HTTPConnectionManager负责为HC 3.1客户端构建连接.
可以扩展默认的HC 3.1 HTTPConnectionManager,以便在以与HTTPUrlConnection相同的方式构建请求时,从ProxySelector(默认或自定义)中查找合适的代理:
public class MyHTTPConnectionManager extends SimpleHttpConnectionManager {
@Override
public HttpConnection getConnectionWithTimeout(
HostConfiguration hostConfiguration, long timeout) {
HttpConnection hc = super.getConnectionWithTimeout(hostConfiguration, timeout);
try {
URI uri = new URI( hostConfiguration.getHostURL());
List<Proxy> hostProxies = ProxySelector.getDefault().select(uri);
Proxy Proxy = hostProxies.get(0);
InetSocketAddress sa = (InetSocketAddress) Proxy.address();
hc.setProxyHost(sa.getHostName());
hc.setProxyPort(sa.getPort());
} catch (URISyntaxException e) {
return hc;
}
return hc;
}
}
然后,在创建HC 3.1客户端时,使用新的连接管理器:
HttpClient client = new HttpClient(new MyHTTPConnectionManager() );
内容总结
以上是互联网集市为您收集整理的java – ProxySelector将URL的方案从https://更改为socket://全部内容,希望文章能够帮你解决java – ProxySelector将URL的方案从https://更改为socket://所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。