使用嵌入式Jetty在WAR之外提供静态内容

时间:2019-05-12 17:06:06

标签: servlets jetty embedded-jetty

我有一个WAR(通过Embedded Jetty提供),我想在WAR之外包含静态文件 。我的目标是:

  • 从WAR外部的路径(相对于Embedded Jetty正在运行的目录)提供静态文件。因此,如果我在const libxmljs = require("libxmljs"); let xmlString = '<set id="1" state="0" name="wd"/>'; let xmlDoc = libxmljs.parseXml(xmlString); res.set('Content-Type', 'text/xml'); res.send(xmlDoc); 中调用jar,我想配置一个URL /srv/app来服务http://myapp.com/static/js/my.js
  • 安全:没有目录列表或/src/app/public/js/my.js路径转义
  • 不要重蹈覆辙:我不想编写新的Servlet,而是利用现有功能
  • 理想情况下(不是必需的):在WAR中隐藏静态内容,以便如果我有../,则将提供该文件,如果不存在,则将WAR的/src/app/public/index.html送达。

这是我检查的内容以及卡住的地方:

  1. DefaultServlet:似乎很理想,但是,我找不到任何方法可以使其在WAR之外提供文件。 DefaultServlet是否可以在WAR之外提供静态内容,并提供相对于应用程序pwd的路径?
  2. 配置码头,如https://www.eclipse.org/jetty/documentation/current/static-content-deployment.html中所述;这似乎是理想的选择,但是在复制时似乎没有任何作用(这是NOOP)。
  3. ResourceHandler:这是正确的方法吗?我无法弄清楚如何使用它来达成目标

1 个答案:

答案 0 :(得分:0)

  

ResourceHandler:这是正确的方法吗?我无法弄清楚如何使用它来达成目标

不要使用ResourceHandler之下的DefaultServlet

  

https://www.eclipse.org/jetty/documentation/current/static-content-deployment.html中所述配置Jetty;这似乎很理想,但是当复制时,似乎什么也没做(这是NOOP)。

仅当您与部署的Web应用程序共享的contextPath不同时,此方法才有效。

  

DefaultServlet是否可以通过WAR以外的路径提供与应用程序的pwd相关的静态内容?

是的,这已通过几种不同的方式记录在stackoverflow上。 关键是,您将在不同的DefaultServlet上使用额外的url-patterns条目,这些条目由它们自己的“资源基本路径”定义(必须是标准路径条目,没有相对路径)。

请参阅: