版本资源解析器不起作用



我的 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 nullencodeURL 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.xmlWebApplicationInitializer 中注册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;
}

相关内容

最新更新