基于apache的httpclient实现。
配置依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
</dependency>
```
MyHttpProxyTest.java
/**
-
http代理demo
*/
public class MyHttpProxyTest {
private static Logger logger = LoggerFactory.getLogger(MyHttpProxyTest.class);/**
-
所有通过httpclient对象发送的请求,实际上都发送给代理。
*/
public static void main(String[] args)throws IOException {
// 创建客户端
// 设置代理IP、端口、协议(请分别替换)
HttpHost proxy = new HttpHost(“localhost”, 8081, “http”);
// 把代理设置到请求配置
RequestConfig defaultRequestConfig = RequestConfig.custom().setProxy(proxy).build();// 实例化CloseableHttpClient对象
CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
// 创建服务端
ServerBootstrap bs = ServerBootstrap.bootstrap().setListenerPort(8080);
bs.registerHandler("/*", new HttpRequestHandler() {
@Override
public void handle(HttpRequest request, HttpResponse response, HttpContext context)
throws HttpException, IOException {
logger.info(“请求=>{}”, request);
CloseableHttpResponse resp = httpclient.execute(proxy, request);
logger.info(“响应=>{}”, resp);
response.setStatusLine(resp.getStatusLine());
response.setHeaders(resp.getAllHeaders());
response.setEntity(resp.getEntity());
response.removeHeaders(HTTP.TRANSFER_ENCODING);// 不允许手动设置该响应头
response.removeHeaders(HTTP.DATE_HEADER);
response.removeHeaders(HTTP.CONTENT_LEN);// 不允许手动设置该响应头
response.removeHeaders(HTTP.SERVER_HEADER);
logger.info(“代理响应=>{}”, response);
}
});
ExceptionLogger exceptionLogger = new ExceptionLogger() {
@Override
public void log(Exception ex) {
logger.error("", ex);
}
};
bs.setExceptionLogger(exceptionLogger);// 默认吞并异常
HttpServer server = bs.create();
server.start();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
server.shutdown(5, TimeUnit.SECONDS);
}
});
}
}
-
有什么用呢?
纯粹是为了玩。
了解apache httpcomponent实现http服务器,
了解apache httpcomponent实现http客户端,
了解代理服务器实现原理。