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 + -
显示快捷键?