cachefilter.java
来自「oscache-2.4.1-full」· Java 代码 · 共 783 行 · 第 1/3 页
JAVA
783 行
} else if ("yes".equalsIgnoreCase(fragmentParam)) {
setFragment(FRAGMENT_YES);
} else if ("auto".equalsIgnoreCase(fragmentParam)) {
setFragment(FRAGMENT_AUTODETECT);
} else {
log.error("OSCache: Wrong value '" + fragmentParam + "' for init parameter 'fragment', defaulting to 'auto detect'.");
}
}
// filter parameter nocache
String nocacheParam = config.getInitParameter("nocache");
if (nocacheParam != null) {
if ("off".equalsIgnoreCase(nocacheParam)) {
nocache = NOCACHE_OFF;
} else if ("sessionIdInURL".equalsIgnoreCase(nocacheParam)) {
nocache = NOCACHE_SESSION_ID_IN_URL;
} else {
log.error("OSCache: Wrong value '" + nocacheParam + "' for init parameter 'nocache', defaulting to 'off'.");
}
}
// filter parameter last modified
String lastModifiedParam = config.getInitParameter("lastModified");
if (lastModifiedParam != null) {
if ("off".equalsIgnoreCase(lastModifiedParam)) {
lastModified = LAST_MODIFIED_OFF;
} else if ("on".equalsIgnoreCase(lastModifiedParam)) {
lastModified = LAST_MODIFIED_ON;
} else if ("initial".equalsIgnoreCase(lastModifiedParam)) {
lastModified = LAST_MODIFIED_INITIAL;
} else {
log.error("OSCache: Wrong value '" + lastModifiedParam + "' for init parameter 'lastModified', defaulting to 'initial'.");
}
}
// filter parameter expires
String expiresParam = config.getInitParameter("expires");
if (expiresParam != null) {
if ("off".equalsIgnoreCase(expiresParam)) {
setExpires(EXPIRES_OFF);
} else if ("on".equalsIgnoreCase(expiresParam)) {
setExpires(EXPIRES_ON);
} else if ("time".equalsIgnoreCase(expiresParam)) {
setExpires(EXPIRES_TIME);
} else {
log.error("OSCache: Wrong value '" + expiresParam + "' for init parameter 'expires', defaulting to 'on'.");
}
}
// filter parameter Cache-Control
String cacheControlMaxAgeParam = config.getInitParameter("max-age");
if (cacheControlMaxAgeParam != null) {
if (cacheControlMaxAgeParam.equalsIgnoreCase("no init")) {
setCacheControlMaxAge(MAX_AGE_NO_INIT);
} else if (cacheControlMaxAgeParam.equalsIgnoreCase("time")) {
setCacheControlMaxAge(MAX_AGE_TIME);
} else {
try {
setCacheControlMaxAge(Long.parseLong(cacheControlMaxAgeParam));
} catch (NumberFormatException nfe) {
log.error("OSCache: Unexpected value for the init parameter 'max-age', defaulting to '60'. Message=" + nfe.getMessage());
}
}
}
// filter parameter ICacheKeyProvider
ICacheKeyProvider cacheKeyProviderParam = (ICacheKeyProvider)instantiateFromInitParam("ICacheKeyProvider", ICacheKeyProvider.class, this.getClass().getName());
if (cacheKeyProviderParam != null) {
setCacheKeyProvider(cacheKeyProviderParam);
}
// filter parameter ICacheGroupsProvider
ICacheGroupsProvider cacheGroupsProviderParam = (ICacheGroupsProvider)instantiateFromInitParam("ICacheGroupsProvider", ICacheGroupsProvider.class, this.getClass().getName());
if (cacheGroupsProviderParam != null) {
setCacheGroupsProvider(cacheGroupsProviderParam);
}
// filter parameter EntryRefreshPolicy
EntryRefreshPolicy expiresRefreshPolicyParam = (EntryRefreshPolicy)instantiateFromInitParam("EntryRefreshPolicy", EntryRefreshPolicy.class, ExpiresRefreshPolicy.class.getName());
if (expiresRefreshPolicyParam != null) {
setExpiresRefreshPolicy(expiresRefreshPolicyParam);
} else {
// setting the refresh period for this cache filter
setExpiresRefreshPolicy(new ExpiresRefreshPolicy(time));
}
// filter parameter scope
String disableCacheOnMethodsParam = config.getInitParameter("disableCacheOnMethods");
if (StringUtil.hasLength(disableCacheOnMethodsParam)) {
disableCacheOnMethods = StringUtil.split(disableCacheOnMethodsParam, ',');
// log.error("OSCache: Wrong value '" + disableCacheOnMethodsParam + "' for init parameter 'disableCacheOnMethods', defaulting to 'null'.");
}
}
private Object instantiateFromInitParam(String classInitParam, Class interfaceClass, String defaultObjectName) {
String className = config.getInitParameter(classInitParam);
if (className != null) {
try {
Class clazz = ClassLoaderUtil.loadClass(className, this.getClass());
if (!interfaceClass.isAssignableFrom(clazz)) {
log.error("OSCache: Specified class '" + className + "' does not implement" + interfaceClass.getName() + ". Using default " + defaultObjectName + ".");
return null;
} else {
return clazz.newInstance();
}
} catch (ClassNotFoundException e) {
log.error("OSCache: Class '" + className + "' not found. Defaulting to " + defaultObjectName + ".", e);
} catch (InstantiationException e) {
log.error("OSCache: Class '" + className + "' could not be instantiated because it is not a concrete class. Using default object " + defaultObjectName + ".", e);
} catch (IllegalAccessException e) {
log.error("OSCache: Class '"+ className+ "' could not be instantiated because it is not public. Using default object " + defaultObjectName + ".", e);
}
}
return null;
}
/**
* {@link ICacheKeyProvider}
* @see com.opensymphony.oscache.web.filter.ICacheKeyProvider#createCacheKey(javax.servlet.http.HttpServletRequest, ServletCacheAdministrator, Cache)
*/
public String createCacheKey(HttpServletRequest httpRequest, ServletCacheAdministrator scAdmin, Cache cache) {
return scAdmin.generateEntryKey(null, httpRequest, cacheScope);
}
/**
* {@link ICacheGroupsProvider}
* @see com.opensymphony.oscache.web.filter.ICacheGroupsProvider#createCacheGroups(javax.servlet.http.HttpServletRequest, ServletCacheAdministrator, Cache)
*/
public String[] createCacheGroups(HttpServletRequest httpRequest, ServletCacheAdministrator scAdmin, Cache cache) {
return null;
}
/**
* Checks if the request is a fragment in a page.
*
* According to Java Servlet API 2.2 (8.2.1 Dispatching Requests, Included
* Request Parameters), when a servlet is being used from within an include,
* the attribute <code>javax.servlet.include.request_uri</code> is set.
* According to Java Servlet API 2.3 this is excepted for servlets obtained
* by using the getNamedDispatcher method.
*
* @param request the to be handled request
* @return true if the request is a fragment in a page
*/
public boolean isFragment(HttpServletRequest request) {
if (fragment == FRAGMENT_AUTODETECT) {
return request.getAttribute("javax.servlet.include.request_uri") != null;
} else {
return (fragment == FRAGMENT_NO) ? false : true;
}
}
/**
* Checks if the request was filtered before, so
* guarantees to be executed once per request. You
* can override this methods to define a more specific
* behaviour.
*
* @param request checks if the request was filtered before.
* @return true if it is the first execution
*/
public boolean isFilteredBefore(ServletRequest request) {
return request.getAttribute(requestFiltered) != null;
}
/*
* isCacheableInternal gurarantees that the log information is correct.
*
* @param request The servlet request
* @return Returns a boolean indicating if the request can be cached or not.
*/
private final boolean isCacheableInternal(ServletRequest request) {
final boolean cacheable = isCacheable(request);
if (log.isDebugEnabled()) {
log.debug("OSCache: the request " + ((cacheable) ? "is" : "is not") + " cachable.");
}
return cacheable;
}
/**
* isCacheable is a method allowing a subclass to decide if a request is
* cachable or not.
*
* @param request The servlet request
* @return Returns a boolean indicating if the request can be cached or not.
*/
public boolean isCacheable(ServletRequest request) {
boolean cacheable = request instanceof HttpServletRequest;
if (cacheable) {
HttpServletRequest requestHttp = (HttpServletRequest) request;
// CACHE-272 don't cache special http request methods
if ((disableCacheOnMethods != null) && (disableCacheOnMethods.contains(requestHttp.getMethod()))) {
return false;
}
if (nocache == NOCACHE_SESSION_ID_IN_URL) { // don't cache requests if session id is in the URL
cacheable = !requestHttp.isRequestedSessionIdFromURL();
}
}
return cacheable;
}
/*
* isCacheableInternal gurarantees that the log information is correct.
*
* @param cacheResponse the HTTP servlet response
* @return Returns a boolean indicating if the response can be cached or not.
*/
private final boolean isCacheableInternal(CacheHttpServletResponseWrapper cacheResponse) {
final boolean cacheable = isCacheable(cacheResponse);
if (log.isDebugEnabled()) {
log.debug("OSCache: the response " + ((cacheable) ? "is" : "is not") + " cachable.");
}
return cacheable;
}
/**
* isCacheable is a method allowing subclass to decide if a response is
* cachable or not.
*
* @param cacheResponse the HTTP servlet response
* @return Returns a boolean indicating if the response can be cached or not.
*/
public boolean isCacheable(CacheHttpServletResponseWrapper cacheResponse) {
// TODO implement CACHE-137 here
// Only cache if the response was 200
return cacheResponse.getStatus() == HttpServletResponse.SC_OK;
}
/**
* Check if the client browser support gzip compression.
*
* @param request the http request
* @return true if client browser supports GZIP
*/
public boolean acceptsGZipEncoding(HttpServletRequest request) {
String acceptEncoding = request.getHeader(HEADER_ACCEPT_ENCODING);
return (acceptEncoding != null) && (acceptEncoding.indexOf("gzip") != -1);
}
// ---------------------------------
// --- getter and setter methods ---
// ---------------------------------
/**
* @return the max-age of the cache control
* @since 2.4
*/
public long getCacheControlMaxAge() {
if ((cacheControlMaxAge == MAX_AGE_NO_INIT) || (cacheControlMaxAge == MAX_AGE_TIME)) {
return cacheControlMaxAge;
}
return - cacheControlMaxAge;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?