Spring MVC VersionResourceResolver/ContentVersionStrategy 在 JSP 中无法正常工作

标签 spring jsp spring-mvc

我有一个 Spring MVC (4.3.0) 应用程序,并注册了一个 VersionResourceResolver,其中添加了 ContentVersionStrategy 和 ResourceHandlerRegistry。我启用了 ResourceUrlEncodingFilter。

    @Bean
    public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
        return new ResourceUrlEncodingFilter();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        boolean devMode = this.env.acceptsProfiles("local");
        //boolean useResourceCache = !devMode;
        Integer cachePeriod = devMode ? 0 : (60 * 60 * 24 * 365); //If dev clear cache else 1 year

        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/resources/")
                .setCachePeriod(cachePeriod)
                .resourceChain(false)
                .addResolver(new VersionResourceResolver()
                    .addContentVersionStrategy("/**"))
                .addTransformer(new AppCacheManifestTransformer());
}

当我使用 c:url 或 spring:url 标签访问 JSP 页面上的/resources(JS、图像、CSS 等)中的任何内容时,“版本化”URL 不会显示(意思是:URL 中没有哈希码) .例子:
<link href="<c:url value="/resources/css/views/login.css" />" rel="stylesheet">

生成:/myapp/resources/css/views/login.css 作为检查页面时的 URL 字符串。

但是,如果我在 Controller 中使用 ResourceURLProvider,我 查看 URL 中的哈希码:
@Autowired
private ResourceUrlProvider mvcResourceUrlProvider;

@RequestMapping(value = { "/" }, method = RequestMethod.GET)
public String projectBaseRedirect() {

    logger.debug("js =  '" + this.mvcResourceUrlProvider.getForLookupPath("/resources/js/views/overview.js") + "'");
    logger.debug("css =  '" + this.mvcResourceUrlProvider.getForLookupPath("/resources/css/views/overview-page.css") + "'");

    return "redirect:/admin/overview";
}

日志消息产生这个:
2016-07-09 11:47:19   DEBUG AdminLoginController:35 - js =  '/resources/js/views/overview-36d1ff98d627d92a72d579eca49dbd8a.js'
2016-07-09 11:47:19   DEBUG AdminLoginController:36 - css =  '/resources/css/views/overview-page-d47f10e5bcf0fdd67bd8057479b523f0.css'

为什么这在 Controller 中有效,但在我的 JSP 页面上无效?

我也在使用 Spring Security (4.1.0) ...

最佳答案

由于您的示例中缺少它,因此您的项目中也可能缺少它。您需要为正在使用的模板引擎提供资源提供程序。在 JSP 的情况下,注册一个过滤器:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Bean
  public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
    return new ResourceUrlEncodingFilter();
  }
}

或者使用带有该过滤器的过滤器注册 bean:
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Bean
  public FilterRegistrationBean filterRegistrationBean() {
    final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new ResourceUrlEncodingFilter());
    filterRegistrationBean.addUrlPatterns("/*");
    return filterRegistrationBean;
  }
}

关于Spring MVC VersionResourceResolver/ContentVersionStrategy 在 JSP 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38386393/

相关文章:

java - InvalidGrantException,运行两个(或更多)Spring OAuth Server 时授权代码无效

html - Eclipse 追不上外部 CSS

java - 在 Eclipse 服务器中运行的简单 Spring 应用程序,但未部署在 Tomcat 中

java - Spring-MVC : Failed to import bean definitions from relative location [servlet-context. xml]

java - 工厂方法的 Spring 注解

java - 如何使用jsp或servlet或java将excel中的大量信息更新到oracle数据库

spring - 寻找正确的方法 : Spring Social + Spring RESTful API + Spring WebApp + Mobile Clients

java - Spring MVC 3.2.3 Tiles 2 HTTP Status 500 - Servlet appServlet 的 Servlet.init() 引发异常

java - Spring + GWT + jackson + JSON响应文本似乎不是标准响应格式

java - 有或没有提交到服务器的Spring JSP文件上传