SpringBoot使用ProxyServlet实现HTTP反向代理

简介: SpringBoot使用ProxyServlet实现HTTP反向代理
<!-- httpproxy -->
<dependency>
    <groupId>org.mitre.dsmiley.httpproxy</groupId>
    <artifactId>smiley-http-proxy-servlet</artifactId>
    <version>1.11</version>
</dependency>
<!-- guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>
# 设置代理
proxy:
  servlet_url: /proxybaidu/*
  target_url: https://www.baidu.com
@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;
    }
  /**
   * fix springboot中使用proxyservlet的 bug.
   *  https://github.com/mitre/HTTP-Proxy-Servlet/issues/83
   *  https://stackoverflow.com/questions/8522568/why-is-httpservletrequest-inputstream-empty
   * @param filter
   * @return  关闭springboot 自带的 HiddenHttpMethodFilter 防止post提交的form数据流被提前消费
   *
   */
  @Bean
  public FilterRegistrationBean registration(HiddenHttpMethodFilter filter) {
      FilterRegistrationBean registration = new FilterRegistrationBean(filter);
      registration.setEnabled(false);
     return registration;
  }
}
  • 测试:localhost:8080/proxybaidu/

浏览器访问:localhost:8080/proxybaidu/ 就会被springboot获取,并代理成 https://www.baidu.com

注意,如果访问:localhost:8080/proxybaidu/xxxxxx 就会被springboot获取,并代理成 https://www.baidu.com/xxxxxx

  • 也可以重新写个类,MyProxyServlet继承ProxyServlet
    在execute方法中添加日志,权限登录等相关的功能
@Override
 protected HttpResponse execute(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;
     }


相关文章
|
6月前
|
Java API Spring
SpringBoot项目调用HTTP接口5种方式你了解多少?
SpringBoot项目调用HTTP接口5种方式你了解多少?
526 2
|
25天前
|
Java 网络架构 Kotlin
kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http
本文是一个入门级教程,介绍了如何使用Kotlin和Spring Boot搭建HTTP服务,并强调了Kotlin的空安全性特性。
47 7
kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http
|
2月前
|
前端开发 JavaScript
node反向代理,解决跨域(http-proxy-middleware)
使用node.js和http-proxy-middleware库实现反向代理,解决跨域问题,允许前端请求通过代理访问不同端口的服务。
76 3
|
22天前
|
SQL JSON 缓存
你了解 SpringBoot 在一次 http 请求中耗费了多少内存吗?
在工作中常需进行全链路压测并优化JVM参数。通过实验可精确计算特定并发下所需的堆内存,并结合JVM新生代大小估算GC频率,进而优化系统。实验基于SpringBoot应用,利用JMeter模拟并发请求,分析GC日志得出:单次HTTP请求平均消耗约34KB堆内存。复杂环境下,如公司线上环境,单次RPC请求内存消耗可达0.5MB至1MB,揭示了高并发场景下的内存管理挑战。
|
3月前
|
缓存 应用服务中间件 API
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(三)
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(三)
38 3
|
3月前
|
缓存 安全 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(二)
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(二)
39 1
|
3月前
|
负载均衡 应用服务中间件 网络安全
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(一)
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(一)
186 0
|
3月前
|
负载均衡 网络协议 应用服务中间件
nginx-http反向代理与负载均衡
nginx-http反向代理与负载均衡
|
5月前
|
Java 应用服务中间件 Apache
Apache HTTP配置反向代理入门
Apache HTTP配置反向代理入门
385 0
Apache HTTP配置反向代理入门
|
5月前
|
Java API Spring
Spring Boot中使用Feign进行HTTP请求
Spring Boot中使用Feign进行HTTP请求