在项目中可以缓存整个页面来提高响应速度,如将首页存到缓存中,需要新建类继承HttpServletResponseWrapper类来实现对响应的静态页面的获取
还需要配置过滤器来拦截页面响应,在拦截器中过滤要拦截的页面,如果该页面存在于缓存中就从缓存中取,如果没有就将页面从后台获取,并存到缓存中
创建的MyResponseWrapper类
import java.io.CharArrayWriter;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class MyResponseWrapper extends HttpServletResponseWrapper{
private PrintWriter cachedWriter;
private CharArrayWriter bufferedWriter;
public MyResponseWrapper(HttpServletResponse response) {
super(response);
//保存返回结果
bufferedWriter = new CharArrayWriter();
// 通过PrintWriter写入到bufferedWriter中
cachedWriter = new PrintWriter(bufferedWriter);
}
@Override
public PrintWriter getWriter() {
return cachedWriter;
}
// 获取原始的HTML页面内容。
public String getResult() {
return bufferedWriter.toString();
}
}
缓存到redis
缓存到redis使用Spring提供的工具类
编写过滤器类
public class CacheFilter2 implements Filter {
private static ApplicationContext ctx;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) response;
HttpServletRequest req = (HttpServletRequest) request;
System.out.println(req.getRequestURI()+"-----------------");
String url = req.getRequestURI();
String substring = url.substring(0, url.lastIndexOf("."));
String extName = substring.substring(substring.lastIndexOf("/"));
System.out.println(extName);
//判断主页
if ( req.getRequestURI().equals("/cn.car/login.jsp")==false) {
chain.doFilter(request, resp);
return;
}
String html = getHtmlFromCache();
if (null == html) {
MyResponseWrapper wrapper = new MyResponseWrapper(resp);
chain.doFilter(request, wrapper);
// 放入缓存
html = wrapper.getResult();
putIntoCache(html);
}
// 返回响应
resp.setContentType("text/html; charset=utf-8");
resp.getWriter().write(html);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
public void setApplicationContext(ApplicationContext applicationContext) {
this.ctx = applicationContext;
}
//取页面
private String getHtmlFromCache() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
StringRedisTemplate redis = (StringRedisTemplate) ac.getBean("redisTemplate");
return redis.opsForValue().get("home");
}
//存页面
private void putIntoCache(String html) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
StringRedisTemplate redis = (StringRedisTemplate) ac.getBean("redisTemplate");
redis.opsForValue().set("home", html, TimeUnit.MINUTES.toSeconds(10));
}
}
Spring配置文件配置
<!-- 缓存 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="1" />
<property name="maxTotal" value="5" />
<property name="blockWhenExhausted" value="true" />
<property name="maxWaitMillis" value="30000" />
<property name="testOnBorrow" value="true" />
</bean>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="localhost" />
<property name="port" value="6379"/>
<property name="password" value="123"/>
<property name="poolConfig" ref="jedisPoolConfig" />
<property name="usePool" value="true"/>
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="jedisConnectionFactory" />
存储到磁盘
public class CacheFilter2 implements Filter {
private static ApplicationContext ctx;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) response;
HttpServletRequest req = (HttpServletRequest) request;
System.out.println(extName);
//判断主页
if ( req.getRequestURI().equals("/cn.car/login.jsp")==false) {
chain.doFilter(request, resp);
return;
}
String html = getHtmlFromCache();
if (null == html) {
MyResponseWrapper wrapper = new MyResponseWrapper(resp);
chain.doFilter(request, wrapper);
// 放入缓存
html = wrapper.getResult();
putIntoCache(html);
}
// 返回响应
resp.setContentType("text/html; charset=utf-8");
resp.getWriter().write(html);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
public void setApplicationContext(ApplicationContext applicationContext) {
this.ctx = applicationContext;
}
//取页面
private String getHtmlFromCache() {
FileInputStream fis;
try {
File file = new File("D:\\webWork\\staticPage", "index.html");
if(file.exists()){
fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
StringBuffer sb = new StringBuffer();
while(line != null){
sb.append(line);
line=br.readLine();
}
fis.close();
return sb.toString();
}
return null;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}finally {
}
}
//存页面
private void putIntoCache(String html) {
try {
FileOutputStream fos = new FileOutputStream(new File("D:\\webWork\\staticPage","index.html"));
fos.write(html.getBytes("utf-8"));
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
web中过滤器配置
<filter>
<filter-name>cache</filter-name>
<filter-class>cn.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cache</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>