⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 requestcachefilter.java

📁 Jodd是一个开源的公用Java基础类库
💻 JAVA
字号:
package jodd.servlet.filters;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jodd.file.FileUtil;
import jodd.servlet.HtmlEncoder;
import jodd.util.Util;

/**
 * Caches http requests. Filter will put itself in ServletContext, so it can
 * be reached from anywhere. Cached requests are stored in a folder and
 * next time when a request comes, content will be read from the cached file,
 * instead of creating it again.
 *
 * @2do add user-defined callback that determines if some request is cached or not.
 */
public class RequestCacheFilter implements Filter {

	private HashMap cacheMap;

	/**
	 * Registers a request that will be cached.
	 *
	 * @param request	request to specify
	 */
	public void register(String request) {
		cacheMap.put(request, Boolean.FALSE);
	}

	/**
	 * Invalidates a request cache. Next time when request is accessed
	 * cache will be created.
	 *
	 * @param request	request to invalidate
	 */
	public void invalidate(String request) {
		cacheMap.put(request, Boolean.FALSE);
	}

	/**
	 * Invalidates all request cache.
	 */
	public void invalidateAll() {
		Iterator iterator = cacheMap.keySet().iterator();
		while (iterator.hasNext()) {
			String key = (String) iterator.next();
			cacheMap.put(key, Boolean.FALSE);
		}
	}

	/**
	 * Determine if request is cached.
	 *
	 * @param request	request to check
	 * @return			<code>null</code> if request is not registered,
	 * 					otherwies, cache status
	 */
	public Boolean isCached(String request) {
		return (Boolean) cacheMap.get(request);
	}


	private ServletContext sc;
	private FilterConfig fc;
	private String cacheFolder;

	/**
	 * Filter initialization.
	 * @param filterConfig
	 * @throws ServletException
	 */
	public void init(FilterConfig filterConfig) throws ServletException {
		this.fc = filterConfig;
		this.sc = filterConfig.getServletContext();
		String realPath = sc.getRealPath("");
		cacheFolder = realPath + fc.getInitParameter("folder");
		cacheMap = new HashMap();
		sc.setAttribute(fc.getInitParameter("ctxname"), this);
	}

	/**
	 * Performs filter.
	 * @param servletRequest
	 * @param servletResponse
	 * @param chain
	 * @throws IOException
	 * @throws ServletException
	 */
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;

		String uri = request.getRequestURI();
		String query = request.getQueryString();
		if (query == null) {
			query = "";
		} else {
			query = "?" + query;
		}
		String ctxPath = request.getContextPath();
		int i = uri.indexOf(ctxPath);
		String req = uri.substring(i + ctxPath.length()) + query;
		Boolean cached = isCached(req);

		if (cached == null) {
			chain.doFilter(request, response);		// request is not registered, execute request
		} else {									// request is registered...
			String fileName = cacheFolder + "/" + HtmlEncoder.encodeUrl(req) + ".cache";
			File file = new File(fileName);
			if (file.exists() == false) {
				invalidate(req);
				cached = Boolean.FALSE;
			}
			String result = null;
			if (cached.equals(Boolean.FALSE)) {
				CharArrayResponseWrapper wrappedResponse = new CharArrayResponseWrapper(response);
				chain.doFilter(request, wrappedResponse);
				result = wrappedResponse.toString();
				FileUtil.writeString(fileName, result);
				cacheMap.put(req, Boolean.TRUE);
			} else {
				result = FileUtil.readString(fileName);
			}
			response.setContentType(sc.getMimeType(uri));

			FileInputStream fis = new FileInputStream(file);
			ServletOutputStream sos = response.getOutputStream();
			Util.copyPipe(fis, sos, 8192);
		}
	}

	public void destroy() {
		//To change body of implemented methods use File | Settings | File Templates.
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -