jsp拦截器缓存源码实例,拦截htm、jsp、.do的配置方法,拦截URI修改其内容的方法讲解,自定义response,用于缓存输出内容,创建新缓存文件,jsp读取缓存文件的内容,写入客户端浏览器:
Cache_Response.java文件源码:
package com.cn.control;
import java.io.*;
import javax.servlet.http.*;
public class Cache_Response extends HttpServletResponseWrapper {
private CharArrayWriter cacheWriter = new CharArrayWriter(); // 缓存字符类输出
public Cache_Response(HttpServletResponse response) throws IOException {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException { // 覆盖父类方法
return new PrintWriter(cacheWriter); // 返回缓存内容的writer
}
@Override
public void flushBuffer() throws IOException { // 覆盖父类方法
cacheWriter.flush();
}
public void finishResponse() throws IOException {
cacheWriter.close();
}
public CharArrayWriter getCacheWriter() { // getter方法
return cacheWriter;
}
public void setCacheWriter(CharArrayWriter cacheWriter) { // setter方法
this.cacheWriter = cacheWriter;
}
}
缓存拦截器Filter_Cache.java实例源码:
package com.cn.filter;
import java.io.*;
import java.net.URLEncoder;
import javax.servlet.*;
import javax.servlet.http.*;
import com.cn.control.Cache_Response;
public class Filter_Cache implements Filter {
// 声明一个Servlet上下文变量
private ServletContext servletContext;
// 声明一个缓存文件夹,使用Tomcat工作目录
private File temporalDir;
// 声明缓存时间,配置在Filter初始化参数中
private long cacheTime = Long.MAX_VALUE;
public void init(FilterConfig config) throws ServletException {
// 把获得的信息放在Tomcat工作文件夹中
temporalDir = (File) config.getServletContext().getAttribute(
“javax.servlet.context.tempdir”);
// 获得 Servlet上下文信息
servletContext = config.getServletContext();
//设置缓存时间
cacheTime = new Long(config.getInitParameter(“cacheTime”));
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
//把ServletRequest对象强转成HttpServletRequest对象
HttpServletRequest request = (HttpServletRequest) req;
// 把ServletResponse对象强转成ServletResponse对象
HttpServletResponse response = (HttpServletResponse) res;
request.setCharacterEncoding(“utf-8″);
response.setCharacterEncoding(“utf-8″);
// 如果提交方式为 POST, 则不经过缓存
if (“POST”.equals(request.getMethod())) {
chain.doFilter(request, response);
return;
}
// 获得请求的 URI
String uri = request.getRequestURI();
if (uri == null)
uri = “”;
//使用replace方法替换特殊字符
uri = uri.replace(request.getContextPath() + “/”, “”);
uri = uri.trim().length() == 0 ? “index.jsp” : uri;
uri = request.getQueryString() == null ? uri : (uri + “?” + request.getQueryString());
// 对应的缓存文件
File cacheFile = new File(temporalDir, URLEncoder.encode(uri, “utf-8″));
System.out.println(cacheFile+”…………”);
System.out.println(cacheFile);
// 如果缓存文件不存在 或者已经超出缓存时间 则请求 Servlet
if (!cacheFile.exists()
|| cacheFile.length() == 0
|| cacheFile.lastModified() < System.currentTimeMillis() – cacheTime) {
// 自定义response,用于缓存输出内容
Cache_Response cacheResponse = new Cache_Response(response);
chain.doFilter(request, cacheResponse);
// 将缓存的内容写入缓存文件
char[] content = cacheResponse.getCacheWriter().toCharArray();
// 创建文件夹
temporalDir.mkdirs();
// 创建新缓存文件
cacheFile.createNewFile();
// 输出到文件中
Writer writer = new OutputStreamWriter(new FileOutputStream(cacheFile), “utf-8″);
writer.write(content);
writer.close();
}
// 设置请求的ContentType
String mimeType = servletContext.getMimeType(request.getRequestURI());
response.setContentType(mimeType);
// 读取缓存文件的内容,写入客户端浏览器
Reader ins = new InputStreamReader(new FileInputStream(cacheFile), “utf-8″);
StringBuffer buffer = new StringBuffer();
char[] cbuf = new char[1024];
int len;
while ((len = ins.read(cbuf)) > -1) {
buffer.append(cbuf, 0, len);
}
ins.close();
// 输出到客户端
response.getWriter().write(buffer.toString());
}
public void destroy() {
}
}
My filter_cache.jsp文件源码:
<%@ page language=”java” contentType=”text/html; charset=utf-8″ %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<title>My filter_cache.jsp</title>
</head>
<body>
<!– 登录菜单 –>
<div id=”loginDiv”>
<a href=”filter_cache.jsp” onclick=”setCookie(‘username’,'Helloween’);”>登陆</a>
<a href=”filter_cache.jsp” onclick=”setCookie(‘username’,'Admin’);setCookie(‘role’,'admin’);”>登录为管理员</a>
</div>
<!– 会员菜单 –>
<div id=”adminDiv” style=”display: none;”>
<a href=”filter_cache.jsp”>会员管理</a>
<a href=”filter_cache.jsp”>公告管理</a>
</div>
<!– 管理员菜单 –>
<div id=”controlDiv” style=”display: none;”>
<a href=”filter_cache.jsp”>个人设置</a>
<a href=”filter_cache.jsp”>修改密码</a>
<a href=”filter_cache.jsp” onclick=”setCookie(‘username’,”);setCookie(‘role’,”);”>退出</a>
</div>
<script type=”text/javascript”>
function setCookie(name, value){ // 设置Cookie
document.cookie = name + ‘=’ + value;
}
function getCookie(name){ // 获取Cookie
var search = name + “=”
if(document.cookie.length > 0){
offset = document.cookie.indexOf(search)
if(offset != -1) {
offset += search.length
end = document.cookie.indexOf(“;”, offset)
if(end == -1) end = document.cookie.length
return unescape(document.cookie.substring(offset, end))
}
else return “”
}
}
if(getCookie(‘username’)){
// 已经登录 隐藏登录菜单
document.getElementById(‘loginDiv’).innerText = ‘欢迎你, ‘ + getCookie(‘username’);
// 显示登录后的操作
document.getElementById(‘controlDiv’).style.display = ‘block’;
}
if(getCookie(‘role’) == ‘admin’){
// 为管理员 显示管理员操作
document.getElementById(‘adminDiv’).style.display = ‘block’;
}
</script>
</body>
</html>
wem.xml配置文件:
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app version=”2.5″
xmlns=”http://java.sun.com/xml/ns/javaee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”>
<filter>
<filter-name>cacheFilter</filter-name>
<filter-class>
com.cn.filter.Filter_Cache
</filter-class>
<init-param>
<param-name>cacheTime</param-name>
<param-value>1000000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>cacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>