github代理(如何在JAVA项目中实现反向代理功能)

 2025-08-12 05:15:01  阅读 468  评论 0

摘要:前言(什么是反向代理)反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。举个例子,比如我访问

前言(什么是反向代理)

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

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

如何在JAVA项目中实现反向代理功能?看我是这么做的

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

JAVA如何实现反向代理

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

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

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


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

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

@Configuration
public class ProxyServletConfig {

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

  	/**
     * 这里可以多加几个,但是servlet名字需要不一样
     */
    @Bean
    public ServletRegistrationBean proxyServletRegistrationBean() {
        // 配置路由策略
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(getProxyServlet(), ContextConstants.PROXY_URL_PATTERN);
        Map 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即可。

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

版权声明:我们致力于保护作者版权,注重分享,被刊用文章【github代理(如何在JAVA项目中实现反向代理功能)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;

原文链接:https://www.yxiso.com/zhishi/2073650.html

标签:github代理

发表评论:

关于我们
院校搜的目标不仅是为用户提供数据和信息,更是成为每一位学子梦想实现的桥梁。我们相信,通过准确的信息与专业的指导,每一位学子都能找到属于自己的教育之路,迈向成功的未来。助力每一个梦想,实现更美好的未来!
联系方式
电话:
地址:广东省中山市
Email:beimuxi@protonmail.com

Copyright © 2022 院校搜 Inc. 保留所有权利。 Powered by BEIMUCMS 3.0.3

页面耗时0.0369秒, 内存占用1.91 MB, 访问数据库24次

陕ICP备14005772号-15