我已将 Spring MVC 调度程序映射为 /*
上的全局前端 Controller 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>
但是,此映射会阻止对 /res/
文件夹中的 CSS、JS、图像等静态文件的访问。
我怎样才能访问它们?
最佳答案
将 Controller servlet 映射到更具体的 url-pattern
上,例如 /pages/*
,将静态内容放在特定文件夹中,例如 /static
并创建一个 Filter
监听 /*
透明地继续任何静态内容的链并将请求分派(dispatch)到 Controller 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
。
关于java - 在/*上映射全局前端 Controller servlet时如何访问静态资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/870150/