欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA HTTP反向代理實(shí)現(xiàn)過(guò)程詳解

 更新時(shí)間:2020年06月30日 15:01:25   作者:斷舍離-重學(xué)JAVA之路  
這篇文章主要介紹了JAVA HTTP反向代理實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

 反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。

 簡(jiǎn)單來(lái)說(shuō),你的反向代理服務(wù)器會(huì)接收請(qǐng)求,但其自身不處理該請(qǐng)求,而是對(duì)請(qǐng)求經(jīng)過(guò)一些處理,例如添加日志、緩存、身份驗(yàn)證等服務(wù),然后再將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的應(yīng)用服務(wù)器中進(jìn)行處理,最后將處理結(jié)果返回。

我目前的需求是,A應(yīng)用需要訪問(wèn)B應(yīng)用的報(bào)表頁(yè)面,B應(yīng)用沒(méi)有源碼,要求自動(dòng)處理B應(yīng)用的登錄權(quán)限。避免用戶重復(fù)登錄。

1. 引入相關(guān)依賴

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

這個(gè)jar包,只有兩個(gè)類,其中核心的就是 ProxyServlet,

作者重寫了HttpServlet的相關(guān)方法。他復(fù)制了新的request為proxyRequest,

然后替換了地址和相關(guān)屬性,并使用HttpClient將proxyRequest發(fā)送出去,

然后將接收到的proxyResponse的內(nèi)容再?gòu)?fù)制給 HttpResponse 。

相當(dāng)于中轉(zhuǎn)站。具體請(qǐng)看源碼。

https://github.com/mitre/HTTP-Proxy-Servlet

2.spring使用:

2.1 application.yml增加代理參數(shù)配置

# 設(shè)置代理
proxy:
 servlet_url: /webappB/*
 target_url: https://webappB_HOST_IP:8001/webappB其他demo
 # servlet_url: /proxybaidu/*
 # target_url: https://www.baidu.com

此處有玄機(jī):

為什么源url和目標(biāo)url根路徑要一致(都為/webappB/)呢?

這是因?yàn)椋?target_url頁(yè)面里不止文本顯示,還有其他資源的調(diào)用,比如圖片,比如里面的js又調(diào)用了其他url.

這樣的話,假如 target頁(yè)面里某個(gè)圖片的url是相對(duì)路徑 img/test.jpg;

你的頁(yè)面上圖的 /webappC/image/test.jpg; 這樣host換了以后是找不到圖片地址的。

當(dāng)然你也可以改下proxyServlet的源碼,讓它換成正確的url地址。如果不想改源碼的話,那還是一致的比較好。少麻煩。

2.2 注冊(cè)servlet.

@Configuration
public class ProxyServletConfiguration {
  /**
   * 讀取配置文件中路由設(shè)置
   */
  @Value("${proxy.servlet_url}")
  private String servlet_url;
  /**
   * 讀取配置中代理目標(biāo)地址
   */
  @Value("${proxy.target_url}")
  private String target_url;

  @Bean
  public Servlet createProxyServlet() {
    /** 創(chuàng)建新的ProxyServlet */
    return new ProxyServlet();
  }

  @Bean
  public ServletRegistrationBean proxyServletRegistration() {
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(createProxyServlet(), servlet_url);
    //設(shè)置網(wǎng)址以及參數(shù)
    Map<String, String> params = ImmutableMap.of("targetUri", target_url, "log", "true");
    registrationBean.setInitParameters(params);
    return registrationBean;
  }
}

2.3測(cè)試。ok.

localhost:8080/proxybaidu/

2.4. 當(dāng)然你也可以重新寫個(gè)類,MyProxyServlet繼承ProxyServlet.

重新其中的 execute方法。添加相關(guān)的功能。日志,權(quán)限登錄等。

@Override
  protected HttpResponse (HttpServletRequest servletRequest, HttpServletResponse servletResponse,
                   HttpRequest proxyRequest) throws IOException {          //設(shè)置header里的授權(quán)信息
    proxyRequest.setHeader("Authorization", "Basic " + getWebappBLoginAuth());
    HttpResponse response = super.doExecute(servletRequest, servletResponse, proxyRequest);

//    設(shè)置跨域,暫時(shí)不用。
//    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;
  }

2.5 后記

這個(gè)ProxyServlet 跟 nginx看著基本功能一樣了,都可以反向代理了。
不過(guò)擴(kuò)展功能和IO性能肯定跟nginx沒(méi)法比。但是這個(gè)是用java語(yǔ)言寫的。
方便二次開(kāi)發(fā)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺析spring定時(shí)器的使用

    淺析spring定時(shí)器的使用

    這篇文章主要介紹了淺析spring定時(shí)器的使用,幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下
    2020-10-10
  • SpringBoot集成Auth0 JWT的示例代碼

    SpringBoot集成Auth0 JWT的示例代碼

    本文主要介紹了SpringBoot集成Auth0 JWT的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 自定義mybatis插件如何實(shí)現(xiàn)sql日志打印

    自定義mybatis插件如何實(shí)現(xiàn)sql日志打印

    這篇文章主要介紹了自定義mybatis插件如何實(shí)現(xiàn)sql日志打印問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • spring boot 下支付寶的開(kāi)箱既用環(huán)境

    spring boot 下支付寶的開(kāi)箱既用環(huán)境

    這篇文章主要介紹了spring boot 下支付寶的開(kāi)箱既用環(huán)境包括使用場(chǎng)景和使用技巧,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-10-10
  • Java 8新增的方法參數(shù)反射實(shí)例分析

    Java 8新增的方法參數(shù)反射實(shí)例分析

    這篇文章主要介紹了Java 8新增的方法參數(shù)反射,結(jié)合實(shí)例形式分析了java8新增api方法參數(shù)反射相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Spring Boot快速入門教程

    Spring Boot快速入門教程

    本篇文章主要介紹了Spring Boot快速入門教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • java 中多線程生產(chǎn)者消費(fèi)者問(wèn)題詳細(xì)介紹

    java 中多線程生產(chǎn)者消費(fèi)者問(wèn)題詳細(xì)介紹

    這篇文章主要介紹了java 中多線程生產(chǎn)者消費(fèi)者問(wèn)題詳細(xì)介紹的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 基于Consumer接口、Predicate接口初使用

    基于Consumer接口、Predicate接口初使用

    這篇文章主要介紹了Consumer接口、Predicate接口初使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • linux中java獲取路徑的實(shí)例代碼

    linux中java獲取路徑的實(shí)例代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于linux中java獲取路徑的實(shí)例代碼以及相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • 基于Redis實(shí)現(xiàn)分布式應(yīng)用限流的方法

    基于Redis實(shí)現(xiàn)分布式應(yīng)用限流的方法

    本篇文章主要介紹了基于 Redis 實(shí)現(xiàn)分布式應(yīng)用限流的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12

最新評(píng)論