1.HtmlStaticFilter :
/**
* 静态页面过滤器
*/
public class HtmlStaticFilter implements Filter {
public final Logger log = Logger.getLogger(HtmlStaticFilter.class);
private static int count = 0;
private XCacheManager cache;
public XCacheManager getCache() {
return cache;
}
public void setCache(XCacheManager cache) {
this.cache = cache;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String refresh = request.getParameter("refresh");
if (StringUtils.isNotBlank(refresh) && "true".equals(refresh)) {
chain.doFilter(request, response);
return;
}
/**
* 获取请求url作为缓存的KEY
*/
String urlKey = request.getServerName()
+ ((HttpServletRequest) request).getRequestURI();
// 不缓存非html请求. js css img 跳过
if (!urlKey.endsWith(".html") && !urlKey.endsWith("/")) {
chain.doFilter(request, response);
return;
}
log.info(++count + ":url=====>" + urlKey);
/**
* 查看缓存中是否有此文件,如果有,返回文件
*/
String content = (String) cache.get(urlKey);
log.info(cache.getClass().getName());
if (content==null) {
log.info("content=====>" + content);// 应该只出现一次
// 使用我们自定义的响应包装器来包装原始的ServletResponse
ResponseWrapper wrapper = new ResponseWrapper(
(HttpServletResponse) response);
/**
* 如果没有,继续请求,获取请求后返回的结果,放入缓存中。
*/
// 这句话非常重要,注意看到第二个参数是我们的包装器而不是response
chain.doFilter(request, wrapper);
content=wrapper.getResult();
cache.set(urlKey, content);
}
/*
* 返回结果编码为UTF-8
*/
response.setCharacterEncoding("UTF-8");
//重置响应输出的内容长度
response.setContentLength(-1);
//输出最终结果
PrintWriter out=response.getWriter();
out.write(content);
out.flush();
out.close();
}
@Override
public void destroy() { }
}
2.ResponseWrapper :
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* 自定义一个响应结果包装器,将在这里提供一个基于内存的输出器来存储所有
* 返回给客户端的原始HTML代码。
*/
public class ResponseWrapper extends HttpServletResponseWrapper {
private PrintWriter cachedWriter;
private CharArrayWriter bufferedWriter;
public ResponseWrapper(HttpServletResponse response) {
super(response);
// 这个是我们保存返回结果的地方
bufferedWriter = new CharArrayWriter();
// 这个是包装PrintWriter的,让所有结果通过这个PrintWriter写入到bufferedWriter中
cachedWriter = new PrintWriter(bufferedWriter);
}
@Override
public PrintWriter getWriter() throws IOException {
// TODO Auto-generated method stub
return cachedWriter;
}
public String getResult() {
return bufferedWriter.toString();
}
}
3.缓存接口 :
import net.sf.ehcache.Cache;
/**
* 缓存接口
*/
public interface XCacheManager {
Object get(String key);
/**
* @return 若已存在,返回false ; 不存在,返回true
*/
void set(String key, Object value);
Cache getCache();
}
4.缓存接口实现类 :
import java.io.Serializable;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
/**
* 依赖EhCache实现缓存基础
*/
public class EhCacheManagerImpl implements XCacheManager {
private Cache cache;
public Cache getCache() {
return cache;
}
public void setCache(Cache cache) {
this.cache = cache;
}
@Override
public Object get(String key) {
Element e=cache.get(key);
if(e!=null){
return e.getValue();
}
return null;
}
@Override
public void set(String key, Object value) {
Element e=new Element(key,(Serializable)value);
cache.put(e);
}
}
5.web.xml配置
<filter>
<filter-name>htmlStaticFilter</filter-name>
<filter class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>htmlStaticFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6.spring-bean.xml配置
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
</bean>
<bean id="configAttributeDefinitionEhcache"
class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager" ref="cacheManager"></property>
<property name="cacheName" value="configAttributeDefinitionEhcache"></property>
</bean>
<!-- 缓存过滤器配置bean -->
<bean id="xCacheManager"
class="com.square.businessmodule.service.cache.EhCacheManagerImpl">
<property name="cache" ref="configAttributeDefinitionEhcache"></property>
</bean>
<bean id="htmlStaticFilter"
class="com.square.usermodule.webapp.servlet.filter.HtmlStaticFilter">
<property name="cache" ref="xCacheManager"></property>
</bean>
7.AB测试结果:
未开启缓存,直接访问本地资源
C:\Documents and Settings\Administrator>ab -n 1000 -c 100 http://localhost:8080/?refresh=true
Server Software: Apache-Coyote/1.1
Server Hostname: localhost
Server Port: 8080
Document Path: /?refresh=true
Document Length: 45454 bytes
Concurrency Level: 100
Time taken for tests: 56.781 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 45820000 bytes
HTML transferred: 45454000 bytes
Requests per second: 17.61 [#/sec] (mean)
Time per request: 5678.125 [ms] (mean)
Time per request: 56.781 [ms] (mean, across all concurrent requests)
Transfer rate: 788.04 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 12.0 0 234
Processing: 500 5548 2272.4 5297 11266
Waiting: 500 5544 2271.3 5297 11266
Total: 500 5550 2271.9 5297 11266
Percentage of the requests served within a certain time (ms)
50% 5297
66% 6797
75% 7500
80% 7859
90% 8641
95% 9281
98% 9828
99% 10188
100% 11266 (longest request)一个请求最长响应时间
开启缓存测试
C:\Documents and Settings\Administrator>ab -n 1000 -c 100 http://localhost:8080/
Server Software: Apache-Coyote/1.1
Server Hostname: localhost
Server Port: 8080
Document Path: /
Document Length: 45454 bytes
Concurrency Level: 100
Time taken for tests: 1.516 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 45556000 bytes
HTML transferred: 45454000 bytes
Requests per second: 659.79 [#/sec] (mean)
Time per request: 151.563 [ms] (mean)
Time per request: 1.516 [ms] (mean, across all concurrent requests)
Transfer rate: 29353.09 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.6 0 16
Processing: 0 146 109.8 141 563
Waiting: 0 144 109.8 141 563
Total: 0 146 109.7 141 563
Percentage of the requests served within a certain time (ms)
50% 141
66% 219
75% 250
80% 266
90% 281
95% 313
98% 313
99% 328
100% 563 (longest request)
比较上述结果,在没有缓存的测试结果下,结果令人鸭梨很大- -
分享到:
相关推荐
【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。...基于Spring+JPA+Velocity+Ehcache开发的商城系统源码+数据库(结合URL重写技术静态化商城前台页面).zip
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等...基于Spring+JPA+Velocity+Ehcache开发的商城系统源码+数据库(结合URL重写技术静态化商城前台页面).zip
1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、...
1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、...
,使用Spring+JPA+Velocity+Ehcache作为基础开发架构,应用SpringSecurity框架管理系统权限,结合URL重写技术静态化商城前台页面。 毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生...
CMS项目的相关资源:包含...页面静态化技术freemarker—优化访问服务器过多,效率低 缓存技术ehcache----优化访问服务器过多,效率低 高级查询技术—简单提供职位的精确查询 邮箱激活技术 Spring拦截器—后台访问安全
使用spring+springmvc框架 ...使用了urlrewrite filter进行地址重写,实现伪静态页面 使用了sitemesh对网页进行布局和修饰 使用了loginFilter对访问进行登录过滤 使用了CheckCodeServlet生成验证码图片
前端:jsp、JQuery 后台:Spring+...因为主页会有大量的人员访问,所以为了降低服务器的压力,避免数据库过多的查询压力,使用Freemaker页面静态化技术处理相关信息页,Ehcache缓存技术降低对数据库的访问次数。
likejd:Shopping商城系统是采用Java语言开发的多用户商城系统,使用Spring + JPA + Velocity + Ehcache作为基础开发架构,应用SpringSecurity框架管理系统权限,结合URL合并技术静态化商城前台页面。商贸开发经验及...
1.40 Spring Boot集成EHCache实现缓存机制 1.41 Spring Boot分布式Session状态保存Redis 1.42 Spring Boot Shiro权限管理 1.43 Spring Boot Shiro权限管理 1.44 Spring Boot Shiro权限管理 1.45 Spring Boot Shiro...
Spring5 是一个重要的版本,距离SpringFramework4差不多四年。在此期间,大多数增强都是在 SpringBoot 项目中完成的。在本文中,我们将很快了解到Spring5发行版中的一些令人兴奋的特性。 1. 基准升级 要构建和运行...
【资源说明】 1、基于SpringBoot+... |——static --:放置静态资源(图片、js、css之类的) |——templates --:themeleaf模板 |——application --:spring配置文件 ### 预览 #### `学生列表` <br> ![]
SpringSecurity框架管理系统权限,结合URL重写技术静态化商城前 台页面。Shopping结合多年的电商开发经验及主流电商的功能特点, 注重系统易用性、功能性、扩展性,充分考虑大数据、大并发、 系统安全、SEO功能,...
使用Spring+JPA+Velocity+Ehcache作为基础开发架构,应用SpringSecurity框架管理系统权限,结合URL重写技术静态化商城前台页面。 Shopping结合多年的电商开发经验及主流电商的功能特点,注重系统易用性、功能性、...
使用Spring+JPA+Velocity+Ehcache作为基础开发架构,应用SpringSecurity框架管理系统权限,结合URL重写技术静态化商城前台页面。 Shopping结合多年的电商开发经验及主流电商的功能特点,注重系统易用性、功能性、...
Zblog a java blog 核心功能 文章/页面发布、分类、统计阅读次数。...静态化 FreeMarker 视图模板 Jsp/Jstl/JspTaglib 其它 Jsoup(xss过滤)、fastjson、IKAnalyzer 前端 jQuery js框架 Bootstrap 后台
1采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3分别封装...
静态化 FreeMarker 视图模板 Jsp/Jstl/JspTaglib 其它 Jsoup(xss过滤)、fastjson、IKAnalyzer 前端 jQuery js框架 Bootstrap 后台界面 UEditor/EpicEditor 编辑器 WebUploader 文件上传 ...