在/*上映射全局前端控制器servlet时如何访问静态资源

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

我将SpringMVC调度器映射为全局前端控制器servlet/*

<servlet>       
  <servlet-name>home</servlet-name>         
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     
</servlet>  
<servlet-mapping>       
  <servlet-name>home</servlet-name>         
  <url-pattern>/*</url-pattern>     
</servlet-mapping>

但是,此映射将停止对CSS、JS、图像等静态文件的访问,这些文件都位于/res/文件夹。

我怎么能访问他们呢?

提问于
用户回答回答于

我也遇到过这种情况,但从未找到一个很好的解决方案。最后,我在URL层次结构中将servlet映射为一个更高的级别:

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

现在,基本上下文(和/res目录中的所有内容)都可以由容器提供。

用户回答回答于

将控制器servlet映射到更具体的url-pattern就像/pages/*,将静态内容放入特定文件夹中,如/static并创建一个Filter倾听/*它透明地继续对任何静态内容的链,并向控制器servlet发送其他内容的请求。

简而言之:

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/pages/*</url-pattern>
</servlet-mapping>

在过滤器中有以下内容doFilter():

HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/static")) {
    chain.doFilter(request, response); // Goes to default servlet.
} else {
    request.getRequestDispatcher("/pages" + path).forward(request, response);
}

不,这不会以/pages在浏览器地址栏中。完全透明。如果必要的话你可以"/static"和/或"/pages"init-param过滤器的。

扫码关注云+社区

领取腾讯云代金券