前言(什么是反向代理)

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

举个例子,比如我访问百度(www.baidu.com),但是我们其实并不知道百度内部到底有多少台服务器、百度是怎么处理这次请求的以及我们应该访问那台服务器。我们只是知道我访问了百度(www.baidu.com)的域名或者公网IP,然后就返回了结果。至于百度前置网关服务根据规则进行转发(至于转发到那台服务器,由负载均衡处理)以及后端服务器处理对外面的用户来说是隐藏的。

注意⚠️反向代理和正向代理的区别。

JAVA如何实现反向代理

Java实现反向代理功能其实非常的简单,因为在Github中有一个开源项目(https://github.com/mitre/HTTP-Proxy-Servlet)HTTP-Proxy-Servlet基于Servlet实现了请求代理。同时这个项目Http请求是依赖于Apache HttpClient项目。

HTTP-Proxy-Servlet如何使用实现反向代理

首先:引入HTTP-Proxy-Servlet项目依赖

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

第二步:配置路由策略,注册Servlet

@Configuration
public class ProxyServletConfig {@Beanpublic Servlet getProxyServlet() {return new ProxyServlet();}/*** 这里可以多加几个,但是servlet名字需要不一样*/@Beanpublic ServletRegistrationBean proxyServletRegistrationBean() {// 配置路由策略ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(getProxyServlet(), ContextConstants.PROXY_URL_PATTERN);Map<String, String> params = new HashMap<>();// 路由策略params.put("targetUri", "http://localhost:8080/proxy/error");params.put(ProxyServlet.P_LOG, "true");servletRegistrationBean.setInitParameters(params);return servletRegistrationBean;}
}

其实这样,启动项目就可以实现反向代理的功能了。但是这种是静态的配置,如果我要基于数据库实现动态的方向代理服务应该怎么做呢?

实现基于数据库动态方向代理

还记得在第二步中有一个ProxyServlet吗?其实我们可以继承这个类实现里面的service(HttpServletRequest request, HttpServletResponse response)方法即可。这里注意这两行代码是反向代理的关键,因为是通过attribute中这两个属性进行判断的。

protected static final String ATTR_TARGET_URI =ProxyServlet.class.getSimpleName() + ".targetUri";
protected static final String ATTR_TARGET_HOST =ProxyServlet.class.getSimpleName() + ".targetHost";@Override
protected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException {//     ...(忽略)...servletRequest.setAttribute(ATTR_TARGET_URI, proxyTarget.getTargetUri());servletRequest.setAttribute(ATTR_TARGET_HOST, gson.fromJson(gson.toJson(proxyTarget.getHttpHost()), HttpHost.class));// ...(忽略)...
}

看到这里聪明的同学们肯定知道应该怎么做了吧,只要在这里读取数据库中的路由规则,然后将刚刚ProxyServletConfig配置类中的路由规则写成(拦截(/*)所有路径并targetUri写成固定即可,反正targetUri已经失效),还要把注册的Servlet改成自己实现的Servlet即可。

怎么样,是不是非常简单实用~

如何在JAVA项目中实现反向代理功能?相关推荐

  1. 如何在Java项目中查找未使用/无效的代码

    本文翻译自:How to find unused/dead code in java projects What tools do you use to find unused/dead code i ...

  2. jfinal 普通java工程_JFinal getModel方法如何在java项目中使用

    JFinal getModel方法如何在java项目中使用 发布时间:2020-11-17 15:11:27 来源:亿速云 阅读:94 作者:Leah 今天就跟大家聊聊有关JFinal getMode ...

  3. IDEA下,如何在java项目中新增jsp模板文件

    IDEA下,如何在java项目中新增jsp模板文件 大家会不会有这样的烦恼,就是当想要创建一个jsp模板文件的时候,右键new的时候找不到JSP选项. 这是因为在创建项目的时候没有选中Web Appl ...

  4. contains方法 java_contains方法如何在Java项目中使用

    contains方法如何在Java项目中使用 发布时间:2020-11-30 15:24:20 来源:亿速云 阅读:88 作者:Leah contains方法如何在Java项目中使用?相信很多没有经验 ...

  5. 如何在vue项目中使用lodop打印插件

    如何在vue项目中使用lodop打印插件 - 简书 先写了个webdemo <%--Created by IntelliJ IDEA.User: AdministratorDate: 2018/ ...

  6. 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程

    Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然. 解析日期表示您有一个表示日期的字符串,例如" 2017-08-3",并且要将其转换为表示Java中日期的 ...

  7. android开发使用c+_如何在Android项目中开始使用C ++代码

    android开发使用c+ by Onur Tuna 通过Onur Tuna 如何在Android项目中开始使用C ++代码 (How to start using C++ code in your ...

  8. php7开发的项目怎么样,如何在PHP7项目中搭建一个多线程

    如何在PHP7项目中搭建一个多线程 发布时间:2021-03-05 15:31:22 来源:亿速云 阅读:93 作者:Leah 这期内容当中小编将会给大家带来有关如何在PHP7项目中搭建一个多线程,文 ...

  9. python中pass的使用_pass语句如何在Python项目中使用

    pass语句如何在Python项目中使用 发布时间:2020-11-16 14:55:02 来源:亿速云 阅读:98 本篇文章为大家展示了pass语句如何在Python项目中使用,内容简明扼要并且容易 ...

最新文章

  1. python queue模块安装_Python queue包_程序模块 - PyPI - Python中文网
  2. jenkins运行日志时间与linux,持续集成之Jenkins结合脚本实现代码自动化部署及一键回滚至上一版本...
  3. C++ Builder 5编HOOK程序
  4. mysql备份与还原-mysqldump备份、mysql与source还原
  5. jdk 安全属性_系统属性的JDK 12 Javadoc标记
  6. 计算机二级MS Office中最难的是Excel?那是因为你没有掌握这些【重难点】!!!
  7. Sharding-JDBC 1.5.0.M1 正式发布,全新的 SQL 解析引擎
  8. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(1)
  9. Navicat过期问题的解决
  10. 微信小程序 计算导航高度、设置浮层位置
  11. matlab目标跟踪目标检测项目系统源码合集【33套】
  12. iOS 广告SDK总结(一)
  13. MySQL中关于字符编码的配置
  14. 查看mysql数据库连接数、并发数相关信息
  15. Windows pytorch编译安装SoftPool
  16. php网页可视化调试工具,php-xdebug调试工具
  17. 剑指 Offer 39. 数组中出现次数超过一半的数字
  18. 基于OkHttp3封装网络请求框架
  19. 众昂矿业刘金海:我国萤石进出口现状解析
  20. 迅雷2009南京大学校园招聘面试题

热门文章

  1. 电脑电池,如何拆解笔记本电脑里的电池
  2. 基金公司算法交易系统架构
  3. 代理模式之详谈动态代理模式(Spring的AOP实现)
  4. 机器学习小试(11)验证码识别测试-使用Qt与Tensorflow2进行深度学习实验
  5. 自己做在线HTML编辑器,#6 从零开始制作在线 代码编辑器
  6. 一下子就弄懂JDK、JRE、JVM和SDK到底是什么了
  7. 南京航空航天计算机课程表,【课程管理】南京航空航天大学本科生课程表编制与运行管理规定...
  8. 短 URL 生成器设计:百亿短 URL 怎样做到无冲突
  9. 用递归法求最大公约数(递归)
  10. About me Friendship links