Do not rewrite relative links with FixedVersionStrategy

Prior to this change, the resource handling FixedVersionStrategy would
be applied on all links that match the configured pattern. This is
problematic for relative links and can lead to rewritten links such as
"/fixedversion/../css/main.css" which breaks.

This commit prevents that Strategy from being applied to such links.
Of course, one should avoid to use that VersionStrategy with relative
links, but this change aims at not breaking existing links even if it
means not prefixing the version as expected.

Issue: SPR-13727
(cherry picked from commit c226753)
This commit is contained in:
Brian Clozel
2015-12-01 14:47:23 +01:00
committed by Juergen Hoeller
parent b3eefa2ae0
commit f53d01b00a
2 changed files with 22 additions and 8 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -100,7 +100,13 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
@Override
public String addVersion(String path, String version) {
return (this.prefix.endsWith("/") || path.startsWith("/") ? this.prefix + path : this.prefix + "/" + path);
if (path.startsWith(".")) {
return path;
}
else {
return (this.prefix.endsWith("/") || path.startsWith("/") ?
this.prefix + path : this.prefix + "/" + path);
}
}
}
@@ -118,7 +124,7 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
Matcher matcher = pattern.matcher(requestPath);
if (matcher.find()) {
String match = matcher.group(1);
return match.contains("-") ? match.substring(match.lastIndexOf("-") + 1) : match;
return (match.contains("-") ? match.substring(match.lastIndexOf("-") + 1) : match);
}
else {
return null;
@@ -134,7 +140,7 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
public String addVersion(String requestPath, String version) {
String baseFilename = StringUtils.stripFilenameExtension(requestPath);
String extension = StringUtils.getFilenameExtension(requestPath);
return baseFilename + "-" + version + "." + extension;
return (baseFilename + "-" + version + "." + extension);
}
}

View File

@@ -1,11 +1,11 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.servlet.resource;
import org.junit.Before;
@@ -21,7 +22,8 @@ import org.junit.Test;
import static org.junit.Assert.*;
/**
* Unit tests for {@link org.springframework.web.servlet.resource.FixedVersionStrategy}
* Unit tests for {@link org.springframework.web.servlet.resource.FixedVersionStrategy}.
*
* @author Brian Clozel
*/
public class FixedVersionStrategyTests {
@@ -57,7 +59,13 @@ public class FixedVersionStrategyTests {
@Test
public void addVersion() throws Exception {
assertEquals(this.version + "/" + this.path, this.strategy.addVersion(this.path, this.version));
assertEquals(this.version + "/" + this.path, this.strategy.addVersion("/" + this.path, this.version));
}
@Test // SPR-13727
public void addVersionRelativePath() throws Exception {
String relativePath = "../" + this.path;
assertEquals(relativePath, this.strategy.addVersion(relativePath, this.version));
}
}