例如10.202.0.236是我们内网的一个服务,但是我们现在无法直接访问怎么办,可以通过一个可以访问内网的http代理服务器来进行访问。
局部使用
这里的主函数就是main函数了;
构建了三个方法,分别是getProxy,setAuthProperties和getContent。
这里的三个方法没有必要一定这么设置,只是我个人的习惯,觉得这样分开看上去会更加可读一些。
三个方法
getProxy
getProxy的用处是获取到proxy对象传入到URLConnection中作为参数来访问目标的地址,需要传入一个列表,分别对应的是http代理服务器的ip、port、username和password。
setAuthProperties
setAuthProperties是用于设置http的认证信息,以便于代理服务器可以认证通过,在getProxy中会对此方法进行调用。
Authenticator.setDefault是需要设置的,否则无法实现对代理服务器的用户名密码认证;
并且System.setProperty(“jdk.http.auth.tunneling.disabledSchemes”, “”);在JDK8以上都需要将这里这样设置的;
其实这里的System.setProperty也可以通过是启动Java程序时设置-Dhttp.proxyUser=username、-Dhttp.proxyPassowrd=password等设置的。
getContent
getContent就是最终的将二进制数据流转化为String进行输出了。
具体代码
package com.learn.myservlet;
import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
public class MyProxyLearn {
public static void main(String[] args) throws IOException {
URL url = new URL("http://10.202.0.236:8080");
// 构建传入代理连接的ip、port和用户名密码
List<String> authList = new ArrayList<>();
String hostname="myhost";
String port = "myport";
String authUser = "myuser";
String authPassword = "mypassword";
authList.add(0,hostname);
authList.add(1,port);
authList.add(2,authUser);
authList.add(3,authPassword);
//通过代理进行连接
URLConnection urlConnection = url.openConnection(getProxy(authList));
//构建input输入流
InputStream input = urlConnection.getInputStream();
//将内容打印至控制台
System.out.println(getContent(input));
}
//设置Proxy并返回
public static Proxy getProxy(List<String> authList){
String hostname = authList.get(0);
int port = Integer.parseInt(authList.get(1));
String authUser = authList.get(2);
String authPassword = authList.get(3);
//设置认证信息
setAuthProperties(authUser,authPassword);
//构造proxy的地址和端口并返回
SocketAddress socketAddress = new InetSocketAddress(hostname,port);
Proxy proxy = new Proxy(Proxy.Type.HTTP,socketAddress);
return proxy;
}
//设置认证相关信息
private static void setAuthProperties(String authUser, String authPassword) {
System.setProperty("http.proxyUser", authUser);
System.setProperty("http.proxyPassword", authPassword);
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
Authenticator.setDefault(
new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(authUser, authPassword.toCharArray());
}
}
);
}
//获取网页的内容,通过StringBuilder将bytes转化为char
public static String getContent (InputStream input) throws IOException {
String content;
int n;
StringBuilder sb = new StringBuilder();
while ((n = input.read()) != -1) {
sb.append((char) n);
}
content = sb.toString();
return content;
}
}
全局使用
构建了两个方法,分别是setAuthProperties和getContent。
setAuthProperties
设置所有的代理信息的
getContent
将input转化为String类型数据
package com.learn.myservlet;
import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
public class MyProxyLearn {
public static void main(String[] args) throws IOException {
URL url = new URL("http://10.230.0.236:8081");
// 构建传入代理连接的ip、port和用户名密码
List<String> authList = new ArrayList<>();
String hostname="myhost";
String port = "myport";
String authUser = "myuser";
String authPassword = "mypassword";
authList.add(0,hostname);
authList.add(1,port);
authList.add(2,authUser);
authList.add(3,authPassword);
//加载全局的代理
setAuthProperties(authList);
URLConnection urlConnection = url.openConnection();
//构建input输入流
InputStream input = urlConnection.getInputStream();
//将内容打印至控制台
System.out.println(getContent(input));
}
//设置认证相关信息
private static void setAuthProperties(List<String> authList) {
String hostname = authList.get(0);
String port = authList.get(1);
String authUser = authList.get(2);
String authPassword = authList.get(3);
System.setProperty("http.proxyHost", hostname);
System.setProperty("http.proxyPort", port);
System.setProperty("http.proxyUser", authUser);
System.setProperty("http.proxyPassword", authPassword);
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
Authenticator.setDefault(
new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(authUser, authPassword.toCharArray());
}
}
);
}
//获取网页的内容,通过StringBuilder将bytes转化为char
public static String getContent (InputStream input) throws IOException {
String content;
int n;
StringBuilder sb = new StringBuilder();
while ((n = input.read()) != -1) {
sb.append((char) n);
}
content = sb.toString();
return content;
}
}