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

Ric*_*oll 59 configuration spring spring-mvc

如果我映射我的spring应用程序来处理所有传入的请求('/*'),那么对静态内容的请求将返回404.例如,对"myhost.com/css/global.css"的请求将返回404,即使资源存在,因为Spring拦截了请求.

另一种方法是将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>
Run Code Online (Sandbox Code Playgroud)

Idealy我希望映射类似于以下内容:

 <servlet-mapping>
    <servlet-name>springApp</servlet-name>
    <url-pattern>/*</url-pattern>
    <exclude>/css/*,/js/*</exclude>
 </servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

这类事可能吗?

atr*_*ain 56

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

(顺便说一下,这个问题也在这里处理过:Spring使用mvc:resources提供静态内容,xsd无效)

查看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/" />
Run Code Online (Sandbox Code Playgroud)

  • 注意:Spring MVC Showcase项目已移至github.访问它:https://github.com/SpringSource/spring-mvc-showcase (6认同)
  • 你会如何使用注释在配置中做同样的事情? (2认同)

小智 27

我通过"默认"servlet提供静态内容来解决这个问题,该servlet只是将内容提供给客户端.所以我的web.xml看起来像这样:

<servlet>
    <servlet-name>MyApp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyApp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping> <!-- The 'dynamic' content -->

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping> <!-- The 'static' content -->
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Chs*_*y76 7

如果你只想用Spring做这个,它可能会有点乱:

  1. 您需要使用SimpleUrlHandlerMapping,您可以为其明确指定应映射到控制器的URL模式,或者扩展它以支持"忽略"URL,如"css/**".
  2. 您需要编写自己的HttpRequestHandler实现,该实现基本上由"getServletContext().getRequestDsipatcher().include()"调用以按原样返回所请求的资源.
  3. 您必须将该处理程序注册为上述SimpleUrlHandlerMapping的defaultHandler.

完成所有操作后,所有无法映射到控制器的请求都将转发给您HttpRequestHandler并按"原样"提供.