首页 > 解决方案 > 如何从内部服务器在 Java Web 应用程序中提供静态内容?

问题描述

这是一个标准(可能是微不足道的)情况,但我找不到有关该主题的详细信息。

假设我们有一个 Web 应用程序A ( http://my-webapp) 和一个文件服务器F ( http://file-server)。

为了清楚起见:

在A中显示存储在F上的图片的最佳做法是什么?

假设客户端发出一个请求http://my-webapp/pictures/123,其中123任何 id,它以某种方式指向存储为的图片http://file-server/storage/xxx123.jpg,并希望在浏览器中看到该图片。

标签: javahttpweb-applicationswebserverstatic-content

解决方案


我建议以下解决方案作为一个最小的示例,这可能是一个很好的起点。

重定向.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 );
    }
  }
}

推荐阅读