无法提供 /WEB-INF/lib/*.jar!/META-INF/resources/ 内容

Unable to serve /WEB-INF/lib/*.jar!/META-INF/resources/ content

我有一个 GWT-Spring 项目,我还有两个模块用作 Web 项目中的库,一切正常,但我正在尝试将一些静态资源放在其中一个上这些模块 (JAR),但是在部署应用程序时我没有看到我的资源,当我尝试获取它们时我只是收到 404。

我在 web.xml 中使用 Servlet 3.0,并将这一行放在我的应用程序配置中:

<mvc:resources mapping="/resources/**"  location="classpath:/META-INF/resources" ></mvc:resources>

此外,我将所有资源都放在 JAR 中的文件夹 META-INF/resources 下。

运行 带有 Jetty (IntelliJ) 的项目如果我去: http://localhost:8888/path/resources 我可以看到这些文件夹的完整列表(我放在 META-INF/resources JAR 上的所有文件夹和Web 项目上的资源,但是关于 JAR,我只能看到文件夹,看不到其中的文件!)

如果我 运行 使用 tomcat 的项目,我只能看到 Web 项目上的资源,但 JAR 中的任何内容。

有什么想法吗?

/WEB-INF/lib/*.jar 中找到的 jars 提供 /META-INF/resources/ 是 Servlet 3.0 规范的一项功能。

因此,Jetty 的内部实现(即其 DefaultServlet)负责根据对此内容的请求提供此内容。

在 Jetty 上,这是通过将 /META-INF/resources/ 内容解压缩到 WebApp 工作目录中以作为磁盘中的普通文件提供的来完成的。

但是,您正在使用 Spring MVC,并且您的配置似乎试图绕过容器的这一功能。不要让 Spring MVC 处理或提供这些资源,让它从 Spring 流出并让 Web 容器本身提供这些资源。

此外,Jetty 的实现可以比任何通用 Servlet 更好地为这些(以及任何类型的)静态资源提供服务(它使用 Jetty 的内部功能来实现这一点)。

示例:

假设您有 foo.war,其中 /WEB-INF/lib/bar.jar 包含单个资源 /META-INF/resources/js/main.js

假设您在 localhost:8080 上有一个带连接器的 Jetty 服务器,使用默认的 webapp 部署,导致 foo.war 的上下文路径为 /foo,那么此资源可能是通过 http://localhost:8080/foo/js/main.js

的请求访问

在以下位置创建了一个示例项目来演示此内容:

github.com/jetty-project/jetty-example-metainf-resources

我发现了问题。

这只是一个安全问题,如果 URL 受到保护,则在没有启动会话的情况下任何资源都将可用。

此外 WEB-INF/lib/*.jar!/META-INF/resources 中的资源不会发布在另一个 "resources" 文件夹下 而是直接发布在根目录下。

谢谢。