首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从内部服务器在Java web应用程序中提供静态内容?

如何从内部服务器在Java web应用程序中提供静态内容?
EN

Stack Overflow用户
提问于 2019-06-11 11:37:10
回答 2查看 1.2K关注 0票数 0

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

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

为清楚起见:

  • A在9号高速公路上运行;
  • F对于Jetty服务器是可见的,对于客户端是不可见的。

A中显示存储在F上的图片的最佳实践是什么

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-12 13:44:18

我提出以下解决方案作为一个最低限度的例子,这可能是一个很好的起点。

.htaccess的重定向似乎是在低层次上做类似的事情。

实际上,这个问题应该由web应用服务器自己来解决,而不需要外部工具(比如Apache或Nginx)的干预。

1.在web.xml中声明servlet

代码语言:javascript
复制
<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

代码语言:javascript
复制
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 );
    }
  }
}
票数 0
EN

Stack Overflow用户

发布于 2019-06-11 12:10:26

“最佳实践”涵盖了很多方面。

出于负载和性能的原因,最好使用web服务器(如NGINX或Apache)而不是应用服务器来提供静态资产。大多数生产环境都有此设置,必要时使用web服务器向应用程序服务器代理请求。

如果有这样的设置,可以将F上的映像驱动器映射为web服务器上的驱动器,并使用.htaccess重写规则来处理文件名逻辑。

如果由于无法在regex或类似的文件中捕获文件名逻辑,则可以在A上编写servlet,以便向“常规”web位置发出重定向。与…有关的东西:

  • 客户端请求http://my-webapp/pictures/123
  • servlet翻译/图片/123为pictures/xxx123
  • servlet问题302重定向到pictures/xxx123
  • 客户端跟随重定向

我强烈建议您不要使用servlet从F读取文件,然后将其流到浏览器;这会消耗应用程序服务器上的大量内存,并且可能会根据本地网络条件而减慢甚至失败。在负载下,应用程序的性能几乎肯定会很快下降。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56542828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档