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;
         }
    
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
`HttpProxy.proxyservlet` 是一个 Java 类或包,提供了一个代理服务器,用于在客户端和服务器之间传递 HTTP 请求和响应。该类允许对响应进行重写,即对从服务器返回的响应进行修改或定制。 重写响应是指在代理服务器接收到从服务器返回的响应后,可以对响应进行修改、过滤或定制化处理。这种重写可以在传递响应给客户端之前进行。 在 `HttpProxy.proxyservlet` 中,重写响应可以通过以下几种方式实现: 1. 修改响应头信息:可以添加、删除或修改响应中的头部字段,如修改响应的 Content-Type、Content-Length 等头部字段。 2. 修改响应内容:可以对返回的响应内容进行修改、过滤或替换。比如可以对 HTML 页面进行内容替换,对图片进行压缩或加水印等操作。 3. 设置响应状态码:可以修改响应的状态码,如将 200 OK 修改为 404 Not Found,以改变服务器返回的状态。 4. 添加自定义响应:可以根据业务需求,添加自定义的响应信息,如添加一个自定义的 HTTP 头部字段、添加一段自定义的响应内容等。 通过以上几种方式,开发人员可以根据具体需求对从服务器返回的响应进行定制化处理,以实现所需的功能和效果。`HttpProxy.proxyservlet` 提供了相应的方法或接口,供开发人员在代理服务器中实现重写响应的逻辑。 总之,`HttpProxy.proxyservlet` 提供了一个强大的代理服务器功能,并支持对从服务器返回的响应进行重写,开发者可以根据需求对响应进行修改或定制化处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讓丄帝愛伱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值