无法提供 /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
的请求访问
在以下位置创建了一个示例项目来演示此内容:
我发现了问题。
这只是一个安全问题,如果 URL 受到保护,则在没有启动会话的情况下任何资源都将可用。
此外 WEB-INF/lib/*.jar!/META-INF/resources
中的资源不会发布在另一个 "resources" 文件夹下 而是直接发布在根目录下。
谢谢。
我有一个 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
在以下位置创建了一个示例项目来演示此内容:
我发现了问题。
这只是一个安全问题,如果 URL 受到保护,则在没有启动会话的情况下任何资源都将可用。
此外 WEB-INF/lib/*.jar!/META-INF/resources
中的资源不会发布在另一个 "resources" 文件夹下 而是直接发布在根目录下。
谢谢。