最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

我目前的需求是,A應(yīng)用需要訪問B應(yīng)用的報表頁面,B應(yī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>

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

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

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

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

相當于中轉(zhuǎn)站。具體請看源碼。

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

此處有玄機:

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

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

這樣的話,假如 target頁面里某個圖片的url是相對路徑 img/test.jpg;

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

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

2.2 注冊servlet.

@Configuration
public class ProxyServletConfiguration {
  /**
   * 讀取配置文件中路由設(shè)置
   */
  @Value("${proxy.servlet_url}")
  private String servlet_url;
  /**
   * 讀取配置中代理目標地址
   */
  @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測試。ok.

localhost:8080/proxybaidu/

2.4. 當然你也可以重新寫個類,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è)置跨域,暫時不用。
//    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 后記

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

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

相關(guān)文章

  • java8 stream的分組功能實例介紹

    java8 stream的分組功能實例介紹

    這篇文章主要給大家介紹了關(guān)于java8 stream的分組功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java8具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 使用java.nio.file?庫優(yōu)雅的操作文件詳解

    使用java.nio.file?庫優(yōu)雅的操作文件詳解

    這篇文章主要介紹了使用java.nio.file?庫優(yōu)雅的操作文件詳解,需要的朋友可以參考下
    2023-05-05
  • 關(guān)于MybatisPlus配置雙數(shù)據(jù)庫驅(qū)動連接數(shù)據(jù)庫問題

    關(guān)于MybatisPlus配置雙數(shù)據(jù)庫驅(qū)動連接數(shù)據(jù)庫問題

    這篇文章主要介紹了MybatisPlus配置雙數(shù)據(jù)庫驅(qū)動連接數(shù)據(jù)庫的具體實現(xiàn),具體的業(yè)務(wù)邏輯,在service層的類或者方法上面添加@DataSource注解來指定該業(yè)務(wù)需要用到的數(shù)據(jù)源,需要的朋友可以參考下
    2022-01-01
  • JAVA操作MongoDB數(shù)據(jù)庫實例教程

    JAVA操作MongoDB數(shù)據(jù)庫實例教程

    MongoDB是一個文檔型數(shù)據(jù)庫,是NOSQL家族中最重要的成員之一,下面這篇文章主要給大家介紹了關(guān)于JAVA操作MongoDB數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Java時區(qū)轉(zhuǎn)換實例代碼解析

    Java時區(qū)轉(zhuǎn)換實例代碼解析

    這篇文章主要介紹了Java時區(qū)轉(zhuǎn)換實例代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 排序算法圖解之Java快速排序的分步刨析

    排序算法圖解之Java快速排序的分步刨析

    快速排序是通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割為獨立的兩個部分,一部分的所有數(shù)據(jù)比另外一部分的所有數(shù)據(jù)要小,然后按照此方法對這兩部分分別進行快速排序,整個過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列。本文通過示例講解了快速排序的實現(xiàn),需要的可以參考一下
    2022-11-11
  • 基于Redisson實現(xiàn)注解式分布式鎖的示例代碼

    基于Redisson實現(xiàn)注解式分布式鎖的示例代碼

    這篇文章主要為大家詳細介紹了如何基于Redisson實現(xiàn)注解式分布式鎖,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以了解一下
    2023-07-07
  • Java中生成不重復(fù)隨機數(shù)的四種方法舉例詳解

    Java中生成不重復(fù)隨機數(shù)的四種方法舉例詳解

    在Java編程中獲取隨機數(shù)是常見的需求,這篇文章主要介紹了Java中生成不重復(fù)隨機數(shù)的四種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • Java源碼解析之LinkedHashMap

    Java源碼解析之LinkedHashMap

    LinkedHashMap是HashMap的子類,所以也具備HashMap的諸多特性.不同的是,LinkedHashMap還維護了一個雙向鏈表,以保證通過Iterator遍歷時順序與插入順序一致.除此之外,它還支持Access Order, ,需要的朋友可以參考下
    2021-05-05
  • Java8中List轉(zhuǎn)Map的多種方式代碼

    Java8中List轉(zhuǎn)Map的多種方式代碼

    這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)Map的多種方式,在實際項目中我們經(jīng)常會用到List轉(zhuǎn)Map操作,本文介紹了多種方法的實現(xiàn)代碼,需要的朋友可以參考下
    2023-08-08

最新評論

榕江县| 镇巴县| 石景山区| 松原市| 苏尼特右旗| 明水县| 大关县| 宜兰市| 娱乐| 汝阳县| 岗巴县| 顺平县| 巴彦淖尔市| 南城县| 马鞍山市| 那坡县| 凌海市| 凤凰县| 东兴市| 蕲春县| 仙游县| 紫金县| 太保市| 石柱| 平泉县| 利津县| 大同市| 湖南省| 三门峡市| 辽宁省| 麻城市| 南木林县| 桐柏县| 浮山县| 五莲县| 合肥市| 台江县| 休宁县| 阿图什市| 高要市| 红原县|