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

Prevent cache of sockjs known prefixes from growing

Issue: SPR-10893
上级 e60e8dc5
......@@ -26,8 +26,7 @@ import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
......@@ -66,6 +65,8 @@ import org.springframework.web.socket.sockjs.SockJsService;
*/
public abstract class AbstractSockJsService implements SockJsService {
private static final int MAX_KNOWN_SOCKJS_PREFIX_COUNT = 100;
protected final Log logger = LogFactory.getLog(getClass());
private static final long ONE_YEAR = TimeUnit.DAYS.toSeconds(365);
......@@ -91,7 +92,7 @@ public abstract class AbstractSockJsService implements SockJsService {
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) {
......@@ -376,7 +377,6 @@ public abstract class AbstractSockJsService implements SockJsService {
for (String prefix : this.validSockJsPrefixes) {
int index = path.lastIndexOf(prefix);
if (index != -1) {
this.knownSockJsPrefixes.add(path.substring(0, index + prefix.length()));
return path.substring(index + prefix.length());
}
}
......@@ -385,7 +385,7 @@ public abstract class AbstractSockJsService implements SockJsService {
// Try SockJS info request
if (path.endsWith("/info")) {
this.knownSockJsPrefixes.add(path.substring(0, path.length() - "/info".length()));
addKnownSockJsPrefix(path.substring(0, path.length() - "/info".length()));
return "/info";
}
......@@ -412,13 +412,23 @@ public abstract class AbstractSockJsService implements SockJsService {
String lastSegment = pathNoSlash.substring(pathNoSlash.lastIndexOf('/') + 1);
if (!isValidTransportType(lastSegment) && !lastSegment.startsWith("iframe")) {
this.knownSockJsPrefixes.add(path);
addKnownSockJsPrefix(path);
return "";
}
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
* 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.
先完成此消息的编辑!
想要评论请 注册