1. 程式人生 > >在Spring應用除錯中實現反向代理伺服器

在Spring應用除錯中實現反向代理伺服器

反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。

簡單來說,你的反向代理伺服器會接收請求,但其自身不處理該請求,而是對請求經過一些處理,例如新增日誌、快取、身份驗證等服務,然後再將請求轉發到相應的應用伺服器中進行處理,最後將處理結果返回。

執行反向代理伺服器

接下來我們自己實現一個可以個性化配置的反向代理伺服器,我們的系統使用了maven作為版本管理,Spring + spring-boot作為框架以幫助我們快速搭建我們的web應用。如果大家對如何搭建一個web應用有興趣,可以學習我們的

Java Web全棧開發,這裡不過多描述。大家把程式碼下載下來後,進入系統根目錄,執行mvn spring-boot:run,即可執行該系統。

注:目前我們使用8888埠,如果需要更改,可以修改src/main/resources/application.properties檔案的server.port屬性。

我們就是百度

開啟瀏覽器,訪問http://localhost:8080,發現我們進入到了百度首頁,進行搜尋、翻頁等操作,發現行為和百度一模一樣,但是域名仍然是我們的localhost:8080。接下來,我們來看看如何達到這樣的效果。

首先是新增依賴,除了Spring-boot最基本依賴外,我們還依賴了兩個庫,一個是Google的guava庫,裡面包含了Google的很多核心庫,我們主要使用其中的集合。另一個是代理的核心庫smiley-http-proxy-servlet

,是github上的一個開源專案:

<dependency>
    <groupId>org.mitre.dsmiley.httpproxy</groupId>
    <artifactId>smiley-http-proxy-servlet</artifactId>
    <version>1.6</version>
</dependency>
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

引入依賴後,我們只需要宣告一個proxy的servlet,並對其進行配置即可:

@Bean
public Servlet baiduProxyServlet(){
    return new ProxyServlet();
}

@Bean
public ServletRegistrationBean proxyServletRegistration(){
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(baiduProxyServlet(), "/*");
    Map<String, String> params = ImmutableMap.of(
            "targetUri", "http://baidu.com", 
            "log", "true");
    registrationBean.setInitParameters(params);
    return registrationBean;
}

我們可以看到,只需要對targetURi進行設定,表明ProxyServlet需要代理http://baidu.com,然後將所有/*交給baiduProxyServlet()進行處理即可。