springboot http プロキシは複数のサーブレットを手動で登録します

Java の http プロキシには、直接使用できるライブラリ、smiley-http-proxy-servlet がすでにあります。原理はリクエストをコピーすることであり、転送要件はゲートウェイの機能と少し似ています
。リクエストの後処理を行い、 springcloud と springgateway を導入したくないので、 smiley-http-proxy-servlet のカプセル化を行う必要があります a. 主に
複数のサーブレットを手動で登録し、いくつかのリクエストをリッスンする必要があります
。サーブレットがサービス メソッドを実行するとき、リクエスト パラメータを書き換えることができます
。 c. サーブレットはサービス メソッドを実行します。 最後に、servletRequest と servletResponse をコピーします。
d. 何らかのビジネス処理を実行します。

  1. smiley-http-proxy-servlet ライブラリ
    pom.xmlの導入
        <dependency>
            <groupId>org.mitre.dsmiley.httpproxy</groupId>
            <artifactId>smiley-http-proxy-servlet</artifactId>
            <version>1.12.1</version>
        </dependency>
  1. リスニング要求と転送要求を構成する (
    application.yml)
proxy:
  configs:
    - servlet_url: /proxy/*
      target_url: http://192.168.0.4:8401/handler1
#      logging_enabled: false
    - servlet_url: /proxy_1/*
      target_url: http://192.168.0.141:9004/handler
      logging_enabled: true

    - servlet_url: /proxy_2/*
      target_url: http://192.168.0.141:8400/handler2
      logging_enabled: true
  1. 構成クラス
@Data
@ConfigurationProperties(prefix = "proxy")
@Component
public class ProxyConfig {
    
    
    private List<ProxyProperties> configs;
    @Data
    public static class ProxyProperties {
    
    
        private String servletUrl;
        private String targetUrl;
        private Boolean loggingEnabled =false;
    }

}
  1. スプリングブート コードの形式でサーブレットを手動で登録する
@Component
public class ServletConfig implements ServletContextInitializer{
    
    
    private final ProxyConfig config;
    @Autowired
    public ServletConfig(ProxyConfig config){
    
    
        this.config = config;
    }
    @Override
    public void onStartup(ServletContext servletContext) {
    
    
        List<ProxyConfig.ProxyProperties> propertiesList = config.getConfigs();
        for (int i = 0; i < propertiesList.size(); i++) {
    
    
            ProxyConfig.ProxyProperties properties = propertiesList.get(i);
            //定义多个servlet
            ServletRegistration initServlet = servletContext.addServlet("MyProxyServlet"+i, MyProxyServlet.class);
            initServlet.addMapping(properties.getServletUrl());
            initServlet.setInitParameter(ProxyServlet.P_TARGET_URI, properties.getTargetUrl());
            initServlet.setInitParameter(ProxyServlet.P_LOG, properties.getLoggingEnabled().toString());
        }
    }
}
  1. サーブレットを書き換え、リクエストと結果を取得し、ログを記録するか、

public class MyProxyServlet extends ProxyServlet {
    
    

    private SourceController biddingController;
	//重写servlet, 获取servletRequest与servletResponse
    protected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException {
    
    
        MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(servletRequest);
        byte[] res = serviceV1(super.targetUri,requestWrapper,servletResponse);//改写请求参数
        this.doExtend(requestWrapper,res);//获取到rep与resp后,去业务处理....
    }

}
  1. ServletRequest クラスをオーバーライドする
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
    
    
	...略
}
  1. リクエストによって返された結果を取得するには、
    smiley-http-proxy-servlet の ProxyServlet::copyResponseEntity メソッドを使用します。

おすすめ

転載: blog.csdn.net/zoeou/article/details/126967315