小编典典

SpringMVC可以配置为处理所有请求,但排除静态内容目录吗?

spring

如果我将spring应用程序映射为处理所有传入请求('/ *'),则对静态内容的请求将返回404。例如,即使当Spring拦截请求时资源存在,对“ myhost.com/css/global.css”的请求也将返回404。

替代方法是将SpringMVC映射到子目录(例如’/ home / ‘),但是在这种情况下,必须在应用程序内的所有链接中传递此目录。有没有一种方法可以将SpringMVC映射到’/ ‘,并从处理中排除一组目录?

我当前的web.xml配置是:

<servlet>
    <servlet-name>springApp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springApp</servlet-name>
    <url-pattern>/home/*</url-pattern>
</servlet-mapping>

从概念上讲,我希望映射如下所示:

 <servlet-mapping>
    <servlet-name>springApp</servlet-name>
    <url-pattern>/*</url-pattern>
    <exclude>/css/*,/js/*</exclude>
 </servlet-mapping>

这种事情有可能吗?


阅读 435

收藏
2020-04-13

共2个答案

小编典典

如果你只想使用Spring进行此操作,则可能会有些混乱:

  1. 你可能需要使用SimpleUrlHandlerMapping,你可以为其明确指定应映射到控制器的URL模式,或对其进行扩展以支持“忽略” URL(例如“ css / **”)。
  2. 你需要编写自己的HttpRequestHandler实现,该实现基本上由“ getServletContext()getRequestDsipatcher()include()”调用组成,以按原样返回所请求的资源。
  3. 你必须为上述SimpleUrlHandlerMapping将该处理程序注册为defaultHandler
    完成所有操作后,所有无法映射到控制器的请求将转发给你HttpRequestHandler,并“按原样”提供。
2020-04-13
小编典典

注意:此答案仅适用于Spring 3.0.4+

在Spring Subversion样本存储库中检出Spring mvc-showcase项目。它确切地显示了你要执行的操作,即可以描述DisapatcherServlet无法处理的静态资源。参见文件/mvc-showcase/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml。这是我如何处理这些排除的摘要,其中JS,CSS和图像位于应用程序上下文根目录中(MVC名称空间映射到mvc

<!-- resources exclusions from servlet mapping -->
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/js/**" location="/js/" />
2020-04-13