栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

1. 引入相关依赖


  org.mitre.dsmiley.httpproxy
  smiley-http-proxy-servlet
  1.11

这个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
  @Value("${proxy.servlet_url}")
  private String servlet_url;
  
  @Value("${proxy.target_url}")
  private String target_url;

  @Bean
  public Servlet createProxyServlet() {
    
    return new ProxyServlet();
  }

  @Bean
  public ServletRegistrationBean proxyServletRegistration() {
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(createProxyServlet(), servlet_url);
    //设置网址以及参数
    Map 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语言写的。
方便二次开发。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/133482.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号