提交 02cb8665 编写于 作者: R Rossen Stoyanchev

Prevent cache of sockjs known prefixes from growing

Issue: SPR-10893
上级 e60e8dc5
...@@ -26,8 +26,7 @@ import java.util.Date; ...@@ -26,8 +26,7 @@ import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
...@@ -66,6 +65,8 @@ import org.springframework.web.socket.sockjs.SockJsService; ...@@ -66,6 +65,8 @@ import org.springframework.web.socket.sockjs.SockJsService;
*/ */
public abstract class AbstractSockJsService implements SockJsService { public abstract class AbstractSockJsService implements SockJsService {
private static final int MAX_KNOWN_SOCKJS_PREFIX_COUNT = 100;
protected final Log logger = LogFactory.getLog(getClass()); protected final Log logger = LogFactory.getLog(getClass());
private static final long ONE_YEAR = TimeUnit.DAYS.toSeconds(365); private static final long ONE_YEAR = TimeUnit.DAYS.toSeconds(365);
...@@ -91,7 +92,7 @@ public abstract class AbstractSockJsService implements SockJsService { ...@@ -91,7 +92,7 @@ public abstract class AbstractSockJsService implements SockJsService {
private final List<String> validSockJsPrefixes = new ArrayList<String>(); private final List<String> validSockJsPrefixes = new ArrayList<String>();
private final Set<String> knownSockJsPrefixes = new CopyOnWriteArraySet<String>(); private final List<String> knownSockJsPrefixes = new CopyOnWriteArrayList<String>();
public AbstractSockJsService(TaskScheduler scheduler) { public AbstractSockJsService(TaskScheduler scheduler) {
...@@ -376,7 +377,6 @@ public abstract class AbstractSockJsService implements SockJsService { ...@@ -376,7 +377,6 @@ public abstract class AbstractSockJsService implements SockJsService {
for (String prefix : this.validSockJsPrefixes) { for (String prefix : this.validSockJsPrefixes) {
int index = path.lastIndexOf(prefix); int index = path.lastIndexOf(prefix);
if (index != -1) { if (index != -1) {
this.knownSockJsPrefixes.add(path.substring(0, index + prefix.length()));
return path.substring(index + prefix.length()); return path.substring(index + prefix.length());
} }
} }
...@@ -385,7 +385,7 @@ public abstract class AbstractSockJsService implements SockJsService { ...@@ -385,7 +385,7 @@ public abstract class AbstractSockJsService implements SockJsService {
// Try SockJS info request // Try SockJS info request
if (path.endsWith("/info")) { if (path.endsWith("/info")) {
this.knownSockJsPrefixes.add(path.substring(0, path.length() - "/info".length())); addKnownSockJsPrefix(path.substring(0, path.length() - "/info".length()));
return "/info"; return "/info";
} }
...@@ -412,13 +412,23 @@ public abstract class AbstractSockJsService implements SockJsService { ...@@ -412,13 +412,23 @@ public abstract class AbstractSockJsService implements SockJsService {
String lastSegment = pathNoSlash.substring(pathNoSlash.lastIndexOf('/') + 1); String lastSegment = pathNoSlash.substring(pathNoSlash.lastIndexOf('/') + 1);
if (!isValidTransportType(lastSegment) && !lastSegment.startsWith("iframe")) { if (!isValidTransportType(lastSegment) && !lastSegment.startsWith("iframe")) {
this.knownSockJsPrefixes.add(path); addKnownSockJsPrefix(path);
return ""; return "";
} }
return null; return null;
} }
private void addKnownSockJsPrefix(String path) {
if (this.knownSockJsPrefixes.size() > MAX_KNOWN_SOCKJS_PREFIX_COUNT) {
String removed = this.knownSockJsPrefixes.remove(0);
if (logger.isWarnEnabled()) {
logger.warn("MAX_KNOWN_SOCKJS_PREFIX_COUNT reached, removed prefix " + removed);
}
}
this.knownSockJsPrefixes.add(path);
}
/** /**
* Validate whether the given transport String extracted from the URL is a valid * Validate whether the given transport String extracted from the URL is a valid
* SockJS transport type (regardless of whether a transport handler is configured). * SockJS transport type (regardless of whether a transport handler is configured).
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册