AbstractCachingViewResolver uses a cache limit of 1024 by default, avoiding overflow for redirect URLs
Issue: SPR-10065
This commit is contained in:
parent
1cb6e3dbb6
commit
9deaefe74d
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2011 the original author or authors.
|
* Copyright 2002-2012 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
package org.springframework.web.servlet.view;
|
package org.springframework.web.servlet.view;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
@ -39,31 +39,56 @@ import org.springframework.web.servlet.ViewResolver;
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractCachingViewResolver extends WebApplicationObjectSupport implements ViewResolver {
|
public abstract class AbstractCachingViewResolver extends WebApplicationObjectSupport implements ViewResolver {
|
||||||
|
|
||||||
/** Whether we should cache views, once resolved */
|
/** Default maximum number of entries for the view cache: 1024 */
|
||||||
private boolean cache = true;
|
public static final int DEFAULT_CACHE_LIMIT = 1024;
|
||||||
|
|
||||||
|
|
||||||
|
private volatile int cacheLimit = DEFAULT_CACHE_LIMIT;
|
||||||
|
|
||||||
/** Whether we should refrain from resolving views again if unresolved once */
|
/** Whether we should refrain from resolving views again if unresolved once */
|
||||||
private boolean cacheUnresolved = true;
|
private boolean cacheUnresolved = true;
|
||||||
|
|
||||||
/** Map from view key to View instance */
|
/** Map from view key to View instance */
|
||||||
private final Map<Object, View> viewCache = new HashMap<Object, View>();
|
private final Map<Object, View> viewCache =
|
||||||
|
new LinkedHashMap<Object, View>(DEFAULT_CACHE_LIMIT, 0.75f, true) {
|
||||||
|
@Override
|
||||||
|
protected boolean removeEldestEntry(Map.Entry<Object, View> eldest) {
|
||||||
|
return size() > getCacheLimit();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify the maximum number of entries for the view cache.
|
||||||
|
* Default is 1024.
|
||||||
|
*/
|
||||||
|
public void setCacheLimit(int cacheLimit) {
|
||||||
|
this.cacheLimit = cacheLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the maximum number of entries for the view cache.
|
||||||
|
*/
|
||||||
|
public int getCacheLimit() {
|
||||||
|
return this.cacheLimit;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable or disable caching.
|
* Enable or disable caching.
|
||||||
|
* <p>This is equivalent to setting the {@link #setCacheLimit "cacheLimit"}
|
||||||
|
* property to the default limit (1024) or to 0, respectively.
|
||||||
* <p>Default is "true": caching is enabled.
|
* <p>Default is "true": caching is enabled.
|
||||||
* Disable this only for debugging and development.
|
* Disable this only for debugging and development.
|
||||||
* <p><b>Warning: Disabling caching can severely impact performance.</b>
|
|
||||||
*/
|
*/
|
||||||
public void setCache(boolean cache) {
|
public void setCache(boolean cache) {
|
||||||
this.cache = cache;
|
this.cacheLimit = (cache ? DEFAULT_CACHE_LIMIT : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return if caching is enabled.
|
* Return if caching is enabled.
|
||||||
*/
|
*/
|
||||||
public boolean isCache() {
|
public boolean isCache() {
|
||||||
return this.cache;
|
return (this.cacheLimit > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -134,7 +159,7 @@ public abstract class AbstractCachingViewResolver extends WebApplicationObjectSu
|
||||||
* @param locale the locale for which the view object should be removed
|
* @param locale the locale for which the view object should be removed
|
||||||
*/
|
*/
|
||||||
public void removeFromCache(String viewName, Locale locale) {
|
public void removeFromCache(String viewName, Locale locale) {
|
||||||
if (!this.cache) {
|
if (!isCache()) {
|
||||||
logger.warn("View caching is SWITCHED OFF -- removal not necessary");
|
logger.warn("View caching is SWITCHED OFF -- removal not necessary");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue