📄 requestcachefilter.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 + -