代理服务器实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoujiaping123/article/details/83036311

基于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客户端,
了解代理服务器实现原理。


猜你喜欢

转载自blog.csdn.net/zhoujiaping123/article/details/83036311