簡體   English   中英

如何從內部服務器提供Java Web應用程序中的靜態內容?

[英]How to serve static content in a Java web app from internal server?

這是一個標准(可能是微不足道的)情況,但我無法找到有關該主題的詳細信息。

假設我們有一個Web應用程序Ahttp://my-webapp )和一個文件服務器Fhttp://file-server )。

為清楚起見:

  • A在Jetty 9上運行;
  • F對Jetty服務器可見,對客戶端不可見。

什么是一個展示存儲F上的圖像的最佳做法是什么?

假設客戶端發出請求http://my-webapp/pictures/123 ,其中123 - 任何id,以某種方式指向存儲為http://file-server/storage/xxx123.jpg的圖片,並期望看到瀏覽器中的圖片。

“最佳實踐”涵蓋了很多方面。

出於負載和性能原因,使用Web服務器(如NGINX或Apache)而不是應用程序服務器來提供靜態資產是個好主意。 大多數生產環境都使用此設置,必要時使用Web服務器將請求代理到應用程序服務器。

如果您有這樣的設置,您可以將F上的圖像驅動器映射為Web服務器上的驅動器,並使用.htaccess重寫規則來處理文件名邏輯。

如果由於無法在正則表達式或類似文件中捕獲文件名邏輯而無法實現,則可以在A上編寫一個servlet來重定向到“常規”Web位置。 有點像:

我強烈建議你不要使用servlet來讀取F中的文件,然后流式傳輸到瀏覽器; 這會占用應用程序服務器上的大量內存,並且可能會因本地網絡狀況而變慢甚至失敗。 您的應用程序的性能幾乎肯定會在負載下很快惡化。

我提出以下解決方案作為一個很好的起點可以作為一個很好的起點。

.htaccess重定向似乎在低級別上做了類似的事情。

實際上,問題應該由Web應用程序服務器本身解決,而無需外部工具(如Apache httpd或Nginx)的干預。

1.在web.xml中聲明servlet

<servlet>
    <servlet-name>pictures</servlet-name>
    <servlet-class>myapplication.servlets.HiddenFileServlet </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>pictures</servlet-name>
    <url-pattern>/pictures/*</url-pattern>
</servlet-mapping>

2.實現servlet

public class HiddenFileServlet extends HttpServlet
{     
  @Inject
  MyService myService; // a service for paths finding on http://file-server

  @Override
  protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws IOException
  {        
    String requestedUri = req.getRequestURI();

    String fileName = myService.getFileName( requestedUri );

    String mime = getServletContext().getMimeType( fileName );

    if ( mime == null )
    {
      resp.setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
      return;
    }
    else
    {
      resp.setContentType( mime );
    }

    // path on http://file-server/storage
    URL fileFullPath = myService.getInternalPath( requestedUri );

    URL file = new URL( fileFullPath );

    try (
        InputStream in = file.openStream();
        OutputStream out = resp.getOutputStream()
    )
    {
       org.apache.commons.compress.utils.IOUtils.copy( in, out );
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM