![](/img/trans.png)
[英]Simplest way to serve static data from outside the application server in a Java web application BUT In WEB LOGIC
[英]How to serve static content in a Java web app from internal server?
這是一個標准(可能是微不足道的)情況,但我無法找到有關該主題的詳細信息。
假設我們有一個Web應用程序A ( http://my-webapp
)和一個文件服務器F ( http://file-server
)。
為清楚起見:
什么是一個展示存儲F上的圖像的最佳做法是什么?
假設客戶端發出請求http://my-webapp/pictures/123
,其中123
- 任何id,以某種方式指向存儲為http://file-server/storage/xxx123.jpg
的圖片,並期望看到瀏覽器中的圖片。
“最佳實踐”涵蓋了很多方面。
出於負載和性能原因,使用Web服務器(如NGINX或Apache)而不是應用程序服務器來提供靜態資產是個好主意。 大多數生產環境都使用此設置,必要時使用Web服務器將請求代理到應用程序服務器。
如果您有這樣的設置,您可以將F上的圖像驅動器映射為Web服務器上的驅動器,並使用.htaccess重寫規則來處理文件名邏輯。
如果由於無法在正則表達式或類似文件中捕獲文件名邏輯而無法實現,則可以在A上編寫一個servlet來重定向到“常規”Web位置。 有點像:
http://my-webapp/pictures/123
我強烈建議你不要使用servlet來讀取F中的文件,然后流式傳輸到瀏覽器; 這會占用應用程序服務器上的大量內存,並且可能會因本地網絡狀況而變慢甚至失敗。 您的應用程序的性能幾乎肯定會在負載下很快惡化。
我提出以下解決方案作為一個很好的起點可以作為一個很好的起點。
.htaccess
重定向似乎在低級別上做了類似的事情。
實際上,問題應該由Web應用程序服務器本身解決,而無需外部工具(如Apache httpd或Nginx)的干預。
<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>
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.