JAVA HTTP反向代理实现过程详解

 更新时间:2020年06月30日 15:01:25   作者:断舍离-重学JAVA之路  
这篇文章主要介绍了JAVA HTTP反向代理实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

 简单来说,你的反向代理服务器会接收请求,但其自身不处理该请求,而是对请求经过一些处理,例如添加日志、缓存、身份验证等服务,然后再将请求转发到相应的应用服务器中进行处理,最后将处理结果返回。

我目前的需求是,A应用需要访问B应用的报表页面,B应用没有源码,要求自动处理B应用的登录权限。避免用户重复登录。

1. 引入相关依赖

<dependency>
  <groupId>org.mitre.dsmiley.httpproxy</groupId>
  <artifactId>smiley-http-proxy-servlet</artifactId>
  <version>1.11</version>
</dependency>

这个jar包,只有两个类,其中核心的就是 ProxyServlet,

作者重写了HttpServlet的相关方法。他复制了新的request为proxyRequest,

然后替换了地址和相关属性,并使用HttpClient将proxyRequest发送出去,

然后将接收到的proxyResponse的内容再复制给 HttpResponse 。

相当于中转站。具体请看源码。

https://github.com/mitre/HTTP-Proxy-Servlet

2.spring使用:

2.1 application.yml增加代理参数配置

# 设置代理
proxy:
 servlet_url: /webappB/*
 target_url: https://webappB_HOST_IP:8001/webappB其他demo
 # servlet_url: /proxybaidu/*
 # target_url: https://www.baidu.com

此处有玄机:

为什么源url和目标url根路径要一致(都为/webappB/)呢?

这是因为: target_url页面里不止文本显示,还有其他资源的调用,比如图片,比如里面的js又调用了其他url.

这样的话,假如 target页面里某个图片的url是相对路径 img/test.jpg;

你的页面上图的 /webappC/image/test.jpg; 这样host换了以后是找不到图片地址的。

当然你也可以改下proxyServlet的源码,让它换成正确的url地址。如果不想改源码的话,那还是一致的比较好。少麻烦。

2.2 注册servlet.

@Configuration
public class ProxyServletConfiguration {
  /**
   * 读取配置文件中路由设置
   */
  @Value("${proxy.servlet_url}")
  private String servlet_url;
  /**
   * 读取配置中代理目标地址
   */
  @Value("${proxy.target_url}")
  private String target_url;

  @Bean
  public Servlet createProxyServlet() {
    /** 创建新的ProxyServlet */
    return new ProxyServlet();
  }

  @Bean
  public ServletRegistrationBean proxyServletRegistration() {
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(createProxyServlet(), servlet_url);
    //设置网址以及参数
    Map<String, String> params = ImmutableMap.of("targetUri", target_url, "log", "true");
    registrationBean.setInitParameters(params);
    return registrationBean;
  }
}

2.3测试。ok.

localhost:8080/proxybaidu/

2.4. 当然你也可以重新写个类,MyProxyServlet继承ProxyServlet.

重新其中的 execute方法。添加相关的功能。日志,权限登录等。

@Override
  protected HttpResponse (HttpServletRequest servletRequest, HttpServletResponse servletResponse,
                   HttpRequest proxyRequest) throws IOException {          //设置header里的授权信息
    proxyRequest.setHeader("Authorization", "Basic " + getWebappBLoginAuth());
    HttpResponse response = super.doExecute(servletRequest, servletResponse, proxyRequest);

//    设置跨域,暂时不用。
//    String origin = servletRequest.getHeader("origin");
//    response.setHeader("Access-Control-Allow-Origin", origin);
//     response.setHeader("Access-Control-Allow-Credentials", "true");
//    response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
//    response.setHeader("Access-Control-Allow-Headers",
//        "Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin" +
//            ",User-Agent,X-Mx-ReqToken,X-Requested-With");
    return response;
  }

2.5 后记

这个ProxyServlet 跟 nginx看着基本功能一样了,都可以反向代理了。
不过扩展功能和IO性能肯定跟nginx没法比。但是这个是用java语言写的。
方便二次开发。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅析spring定时器的使用

    浅析spring定时器的使用

    这篇文章主要介绍了浅析spring定时器的使用,帮助大家更好的理解和学习spring框架,感兴趣的朋友可以了解下
    2020-10-10
  • SpringBoot集成Auth0 JWT的示例代码

    SpringBoot集成Auth0 JWT的示例代码

    本文主要介绍了SpringBoot集成Auth0 JWT的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 自定义mybatis插件如何实现sql日志打印

    自定义mybatis插件如何实现sql日志打印

    这篇文章主要介绍了自定义mybatis插件如何实现sql日志打印问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • spring boot 下支付宝的开箱既用环境

    spring boot 下支付宝的开箱既用环境

    这篇文章主要介绍了spring boot 下支付宝的开箱既用环境包括使用场景和使用技巧,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-10-10
  • Java 8新增的方法参数反射实例分析

    Java 8新增的方法参数反射实例分析

    这篇文章主要介绍了Java 8新增的方法参数反射,结合实例形式分析了java8新增api方法参数反射相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • Spring Boot快速入门教程

    Spring Boot快速入门教程

    本篇文章主要介绍了Spring Boot快速入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • java 中多线程生产者消费者问题详细介绍

    java 中多线程生产者消费者问题详细介绍

    这篇文章主要介绍了java 中多线程生产者消费者问题详细介绍的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • 基于Consumer接口、Predicate接口初使用

    基于Consumer接口、Predicate接口初使用

    这篇文章主要介绍了Consumer接口、Predicate接口初使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • linux中java获取路径的实例代码

    linux中java获取路径的实例代码

    在本篇文章里小编给大家整理的是一篇关于linux中java获取路径的实例代码以及相关知识点,有兴趣的朋友们可以学习参考下。
    2020-02-02
  • 基于Redis实现分布式应用限流的方法

    基于Redis实现分布式应用限流的方法

    本篇文章主要介绍了基于 Redis 实现分布式应用限流的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论