使用JRebel 6.0.0进行部署时,在Spring 4.1.2更新之后找不到资源

问题描述

(我无法在当前的JRebel 6.1.1中重现 )-我猜 已修复(2014年12月23日)

修复了Spring ResourceHttpRequestHandler无法为webroot之外的资源提供服务的问题。

(JRebel Changeloghttps://zeroturnaround.com/software/jrebel/download/changelog/6-x/

对于感兴趣的人如何解决它:

我只能猜测,因为这很奇怪。Spring 4.1.6(即我用于测试的版本)的类org.springframework.web.servlet.resource.PathResourceResolver具有方法checkResource(Resource resource, Resource location)

protected boolean checkResource(Resource resource, Resource location) throws IOException {
    if (isResourceUnderLocation(resource, location)) {
        return true;
    }
    if (getAllowedLocations() != null) {
        for (Resource current : getAllowedLocations()) {
            if (isResourceUnderLocation(resource, current)) {
                return true;
            }
        }
    }
    return false;
}

第一种ifisResourceUnderLocation...检查请求是否正在访问已配置资源文件夹之外的资源的方法

isResourceUnderLocation(Resource resource, Resource location) {
    ...
    resourcePath = ((ServletContextResource) resource).getPath();
    locationPath = StringUtils.cleanPath(((ServletContextResource) location).getPath());
    ...
    if (!resourcePath.startsWith(locationPath)) {
        return false;
    }
    ...
 }

当我使用调试器检查JRebel处于活动状态时,发生了什么事情时,发生了一些奇怪的事情:当JVM上线时if (isResourceUnderLocation(resource, location)) {,该方法isResourceUnderLocation就不会被调用

因此,我得出的结论是,JRebel进行了一些字节码操作,以防止执行检查(以及整个isResourceUnderLocation方法)。

解决方法

Spring 4.1.2(4.0.8和3.2.12)包含一个Security Bugfix
SPR-12354,可防止ResourceHttpRequestHandler(后面的东西<mvc:resources>)从资源文件夹外部加载文件。

另一方面:是JRebel(我将其与默认配置一起使用)。它似乎表明JRebel做了一些魔术,不是从wtp文件夹而是直接从“
source”文件夹加载资源。

因此,从Spring 3.2.11升级到3.2.12(以及其他类似的应用程序从4.0.7升级到4.0.8)之后,Spring
ResourceHttpRequestHandler不再提供JRebel“维护”的资源文件。而是提供了404。原因是Spring将配置的资源文件夹的绝对文件路径与将要传递的文件的绝对文件路径进行比较。如果ResourceHttpRequestHandler认为该文件位于已配置的资源文件夹之外,则认为用于选择该文件的URL是恶意的。因此,ResourceHttpRequestHandler找不到与404资源的和响应。

我希望可以将JRebel配置为不“维护” js,png和css文件,但我不知道如何。这就是问题: 如何配置Spring MVC应用程序(v
4.0.8)仍提供资源的JRebelResourceHttpRequestHandler

(我希望几乎每个JRebel用户在升级到Spring 4.1.2、4.0.8或3.2.12后都会遇到此问题)。

(不要误会我的意思,这不是如何操作Spring而不是检查文件是否位于configures资源文件夹之外的问题。我已经查看了源代码,观察到的行为是预期的行为。由错误修复的作者撰写-
这个问题与配置JRebel有关)