我的 spring 应用程序中有这样的静态资源结构:
src
main
webapp
resouces
css..
js..
并像这样配置了版本资源解析器:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)).resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
我在 jsp 中包含使用 jstl 的资源:
<script type="text/javascript" src="<c:url value="/resources/js/my.js"/>"></script>
但是当我运行应用程序时,我看不到任何类型的版本控制。我错过了什么?
我也试过:
https://stackoverflow.com/a/38407644/3603806
但没有运气
更新
我包括这样的资源:
<link rel="stylesheet" href="<c:url value="/resources/css/mycss.css?v=2" />">
<script type="text/javascript" src="<c:url value="/resources/js/myjs.js?v=1"/>"></script>
这就是正在生成的内容:
<link rel="stylesheet" href="/app/resources/css/mycss.css?v=2">
<script type="text/javascript" src="/app/resources/js/myjs.js?v=1"></script>
索引页使用 :
<welcome-file-list>
<welcome-file>/WEB-INF/views/index.jsp</welcome-file>
</welcome-file-list>
控制器:家用等
@RequestMapping(value = "/home", method = RequestMethod.GET)
public ModelAndView home(HttpServletRequest request, ModelMap model) {
...
}
可能ResourceUrlProvider is null
你encodeURL
ResourceUrlEncodingFilter.ResourceUrlEncodingResponseWrapper
@Override
public String encodeURL(String url) {
ResourceUrlProvider resourceUrlProvider = getResourceUrlProvider();
if (resourceUrlProvider == null) {
logger.debug("Request attribute exposing ResourceUrlProvider not found");
return super.encodeURL(url);
}
initIndexLookupPath(resourceUrlProvider);
if (url.length() >= this.indexLookupPath) {
String prefix = url.substring(0, this.indexLookupPath);
int suffixIndex = getQueryParamsIndex(url);
String suffix = url.substring(suffixIndex);
String lookupPath = url.substring(this.indexLookupPath, suffixIndex);
lookupPath = resourceUrlProvider.getForLookupPath(lookupPath);
if (lookupPath != null) {
return super.encodeURL(prefix + lookupPath + suffix);
}
}
return super.encodeURL(url);
}
要修复它,请在 web.xml
或 WebApplicationInitializer
中注册ResourceUrlEncodingFilter
,如下所示:
<filter>
<filter-name>resourceUrlEncodingFilter</filter-name>
<filter-class>
org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>resourceUrlEncodingFilter</filter-name>
<servlet-name>spring-dispatcher</servlet-name>
</filter-mapping>
其中spring-dispatcher
DispatcherServlet
,如:
<servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
并确保您的my jsp
是通过 spring-dispatcher
渲染的,例如:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
@RequestMapping(value = "/my-jsp", method = RequestMethod.GET)
public String home() {
return "my";
}
}
我在 GitHub 上创建了一个示例应用程序 - spring-resource-versioning,它可以回答您的进一步问题。
希望对您有所帮助!
我遇到了同样的问题,就像 1 小时前一样。我通过覆盖此方法解决了它:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
VersionResourceResolver versionResolver = new VersionResourceResolver()
.addFixedVersionStrategy(version, "/**/*.js")
.addContentVersionStrategy(version, "/**/*.css", "/**/*.png"); //adjust those paths according to the webapp's folder names
registry.addResourceHandler("/res/**")
.addResourceLocations("/resources/")
.setCachePeriod(CACHE_SECONDS)
.resourceChain(true)
.addResolver(versionResolver);
}
正如Arpit Aggarwal所说,你需要ResourceUrlEncodingFilter
与你的主要DispacherServlet
相对应。但是在 java 配置中添加它对我没有帮助。
我通过替换解决了这个问题
@Bean
public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
return new ResourceUrlEncodingFilter();
}
跟
@Bean
public FilterRegistrationBean<?> resourceUrlEncodingFilterRegistration() {
FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new ResourceUrlEncodingFilter());
registration.addUrlPatterns("/*");
return registration;
}