`
wutao8818
  • 浏览: 618529 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何实现基于filter的html静态化

阅读更多
AB测试数据,显示处理速度接近提升20倍(红色文字),并且在未开启时出现了大量的失败

引用


mysql连接为默认设置

ERROR [http-80-5] JDBCExceptionReporter.logExceptions(78) | Unable to connect to any hosts due to exception: java.net.SocketException: java.net.ConnectException: Connection refused: connect

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: java.net.ConnectException: Connection refused: connect

STACKTRACE:

java.net.SocketException: java.net.ConnectException: Connection refused: connect





引用


启用缓存时测试数据,红字部分

C:\Documents and Settings\Administrator>ab -n 1000 -c 10 http://www.abc.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.abc.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache-Coyote/1.1
Server Hostname:        www.abc.com
Server Port:            80

Document Path:          /
Document Length:        0 bytes

Concurrency Level:      10
Time taken for tests:   10.172 seconds
Complete requests:      1000
Failed requests:        0

Write errors:           0
Non-2xx responses:      1000
Total transferred:      109000 bytes
HTML transferred:       0 bytes
Requests per second:    98.31 [#/sec] (mean)
Time per request:       101.719 [ms] (mean)

Time per request:       10.172 [ms] (mean, across all concurrent requests)
Transfer rate:          10.46 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.9      0      16
Processing:    16  101  11.4    109     125
Waiting:        0   51  27.7     47     109
Total:         16  101  11.4    109     125

Percentage of the requests served within a certain time (ms)
  50%    109
  66%    109
  75%    109
  80%    109
  90%    109
  95%    109
  98%    109
  99%    109
100%    125 (longest request)

---------------------------------------------------------------------------------------------------

关闭缓存时测试数据,红字部分

C:\Documents and Settings\Administrator>ab -n 1000 -c 10 http://www.abc.com/?refresh=true
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.abc.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache-Coyote/1.1
Server Hostname:        www.abc.com
Server Port:            80

Document Path:          /?refresh=true
Document Length:        20385 bytes

Concurrency Level:      10
Time taken for tests:   193.406 seconds
Complete requests:      1000
Failed requests:        503
   (Connect: 0, Receive: 0, Length: 503, Exceptions: 0)

Write errors:           0
Non-2xx responses:      503
Total transferred:      10479297 bytes
HTML transferred:       10131345 bytes
Requests per second:    5.17 [#/sec] (mean)
Time per request:       1934.063 [ms] (mean)

Time per request:       193.406 [ms] (mean, across all concurrent requests)
Transfer rate:          52.91 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   4.3      0      31
Processing:    94 1906 1426.7   2000    8234
Waiting:       94 1893 1428.6   1984    8234
Total:         94 1907 1426.2   2000    8234

Percentage of the requests served within a certain time (ms)
  50%   2000
  66%   2031
  75%   3000
  80%   3016
  90%   4016
  95%   5016
  98%   6031
  99%   6063
100%   8234 (longest request)



-------------------------
实现思路

引用
以URL为key,ehcache为容器,如果容器中存在html结果,直接返回,如果没有,继续生成,返回后的结果放入容器,同时将结果返回给客户端,结束流程。


组成构建:

1.HtmlStaticFilter


public class HtmlStaticFilter implements Filter {

	private static final Log log = LogFactory.getLog(HtmlStaticFilter.class);

	private Xcache xcache;

	public Xcache getXcache() {
		return xcache;
	}

	public void setXcache(Xcache xcache) {
		this.xcache = xcache;
	}

	private static int counter = 0;

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterChain) throws ServletException, IOException {

		String refresh = request.getParameter("refresh");
		if (StringUtils.isNotBlank(refresh) &&refresh.equals("true")) {
			filterChain.doFilter(request, response);
			return;
		}

		/**
		 * 获取请求url作为缓存的KEY
		 */
		String urlKey = request.getServerName()
				+ ((HttpServletRequest) request).getRequestURI();

		// 不缓存非html请求. js css img 跳过
		if (!urlKey.endsWith(".html") && !urlKey.endsWith("/")) {
			filterChain.doFilter(request, response);
			return;
		}
		log.error(++counter + ":url=====>" + urlKey);
		/**
		 * 查看缓存中是否有此文件,如果有,返回文件
		 */
		String content = (String) xcache.get(urlKey);
		if (content == null) {
			log.error("content=====>" + content);// 应该只出现一次
			// 使用我们自定义的响应包装器来包装原始的ServletResponse
			ResponseWrapper wrapper = new ResponseWrapper(
					(HttpServletResponse) response);
			/**
			 * 如果没有,继续请求,获取请求后返回的结果,放入缓存中。
			 */
			// 这句话非常重要,注意看到第二个参数是我们的包装器而不是response
			filterChain.doFilter(request, wrapper);
			// 处理截获的结果并进行处理,比如替换所有的“名称”为“铁木箱子”
			content = wrapper.getResult();
			xcache.set(urlKey, content);
		}

		/**
		 * 返回请求结果给客户端
		 */
		response.setCharacterEncoding("UTF-8");
		// 重置响应输出的内容长度
		response.setContentLength(-1);
		// 输出最终的结果
		PrintWriter out = response.getWriter();
		out.write(content);
		out.flush();
		out.close();
	}

	@Override
	public void destroy() {

	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {

	}

}



构件2:ResponseWrapper




/**
 * 自定义一个响应结果包装器,将在这里提供一个基于内存的输出器来存储所有 返回给客户端的原始HTML代码。
 * 
 * @author 铁木箱子
 * 
 */
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() {
		return cachedWriter;
	}

	/**
	 * 获取原始的HTML页面内容。
	 * 
	 * @return
	 */
	public String getResult() {
		return bufferedWriter.toString();
	}
}



3.Xcache实现类EhcacheXcache


public class EhcacheXcache implements Xcache {

	private Cache cache;

	public Cache getCache() {
		return cache;
	}

	public void setCache(Cache cache) {
		this.cache = cache;
	}

	public Object get(Object key) {
		Element e = (Element) cache.get(key);
		if (e != null) {
			return e.getValue();
		}
		return null;
	}

	public void set(String key, Object value) {
		Element e = new Element(key, value);
		cache.put(e);
	}

	@Override
	public String getName() {
		return cache.getName();
	}

}



4.基于spring管理的filter
引用


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>


spring配置文件

<bean id="htmlStaticFilter" class="com.webapp.filter.HtmlStaticFilter">
<property name="xcache">
<ref bean="xcache" />
</property>
</bean>

<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
</bean>

<bean id="htmlCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager" ref="cacheManager"></property>
<property name="cacheName" value="htmlCache"></property>
</bean>

<bean id="xcache" class="com.cache.EhcacheXcache">
<property name="cache" ref="htmlCache"></property>
</bean>




完。

分享到:
评论

相关推荐

    JSP使用URLRewirte实现静态 例子

    本篇文章将深入探讨如何在JSP环境中使用URLRewrite工具来实现URL的伪静态化,以及其背后的原理和优势。 首先,我们要理解什么是URL伪静态化。在动态网站中,URL通常会包含一些参数,如 "?id=123",这样的URL对于...

    jsp动态页面转化静态化--实例

    3. 实现静态化逻辑:在Servlet或Filter中,当接收到请求时,判断是否需要生成静态页面。如果需要,可以使用JSP的`javax.servlet.jsp.JspWriter`对象将JSP内容写入到HTML文件中,然后返回该HTML文件的路径。 4. 配置...

    java伪静态的实现doc

    在Java中实现伪静态主要依赖于URL重写技术。 首先,我们可以使用开源库`URLRewriteFilter`来实现这个功能。`URLRewriteFilter`是一个基于Servlet的过滤器,它可以拦截HTTP请求并按照预设规则重写URL。在项目中,你...

    java伪静态简单实例

    `urlrewrite`是一个基于Apache Tomcat的URL重写过滤器,它可以方便地实现URL的重写和伪装,包括实现伪静态功能。要使用`urlrewrite`,你需要先将其添加到你的项目依赖中,通常是在`pom.xml`文件中引入对应的Maven...

    urlrewritefilter实现伪静态

    **URLRewriteFilter详解:实现高效且优雅的伪静态** 在Web开发中,为了提高用户体验和搜索引擎优化(SEO),我们常常需要将动态URL转化为看似静态的格式,这就是所谓的“伪静态”。URLRewriteFilter是一个非常实用...

    jsp生成静态页

    3. 使用第三方库:例如,JSP缓存库如CachingFilter、PageCachingFilter等可以帮助实现JSP页面的静态化。 五、注意事项 静态化虽然带来了性能提升,但也存在一些问题。例如,更新内容时需要手动或自动刷新静态页面,...

    伪静态.txt伪静态.txt

    ### 四、基于Java Web的伪静态实现示例 本节将详细介绍如何在Java Web应用中实现伪静态,主要通过配置UrlRewriteFilter来完成。 #### 1. 配置Filter 首先,在`web.xml`文件中配置UrlRewriteFilter,以便在Web应用...

    jsp 利用urlrewritefilter实现伪静态

    **标题解析:** ...在JSP应用中,通过使用URLRewriteFilter,我们可以轻松实现URL的伪静态化,提升网站的SEO性能,同时保持代码的灵活性。理解并熟练运用这一技术,有助于提升Web应用的整体质量和用户体验。

    urlrewrite静态页面的使用例子

    5. **SEO优化**:静态化的URL对于SEO非常重要,因为搜索引擎更容易理解和索引具有明确意义的URL。通过`urlrewrite`,你可以创建友好的URL,比如`/category/product-name.html`,而不是`/product?id=123`,从而提高...

    jsp实现将动态网页转换成静态页面的方法.docx

    ### JSP实现将动态网页转换成静态页面的方法 #### 概述 在Web开发中,为了提高网站的访问速度及减少服务器对数据库的频繁访问,一种常见的做法是将原本动态生成的内容转换为静态页面。本篇文章将深入探讨如何通过...

    静态化web论坛系统_jee_论坛_论坛web_freemaker_droppedvxd_

    综上所述,这个基于JEE和Freemarker的静态化Web论坛系统结合了Java企业级开发的强大功能和模板引擎的便利性,实现了高效、易用的在线讨论平台。通过合理的数据库设计、安全策略和优化手段,确保了系统的稳定性和用户...

    urlrewritefilter-4.0.3.jar 实现网站伪静态301重定向

    `UrlRewriteFilter` 是一个基于Java的URL重写工具,适用于Tomcat等Servlet容器,能够帮助开发者实现复杂的URL转换规则,包括301永久重定向。在本文中,我们将详细探讨`UrlRewriteFilter-4.0.3.jar`的使用方法、原理...

    伪静态_URLRewrite实例解析

    【伪静态_URLRewrite实例解析】中的主要知识点集中在如何通过URLRewrite技术实现网页的伪静态化,这对于SEO(搜索引擎优化)和用户体验都有积极影响。下面将详细解释这个过程: 1. **什么是伪静态**: 伪静态是一...

    ssh2中的urlrewrite和Struts2的生成静态页面

    - **实现静态化**:为了实现Struts2页面的静态化,可以自定义一个Freemarker Result Type,该类型负责读取模板文件并填充数据模型,然后将其内容输出到文件系统中,形成静态页面。 以下是一个简单的自定义...

    ecshop伪静态IIS下规则

    以上规则的解析和应用,能够帮助我们在IIS服务器环境下顺利实现ECSHOP的伪静态化处理。通过这些规则,不仅可以提升网站的搜索引擎排名,还能增强用户的访问体验,从而促进电商网站的发展与壮大。需要注意的是,实际...

    基于javaweb实现的简单购物商城0418.rar

    【标题】"基于javaweb实现的简单购物商城0418.rar" 是一个压缩包文件,它包含了一个使用JavaWeb技术开发的简易在线购物商城的源代码和相关资源。这个项目可能是一个教学实例或者是一个初级开发者的学习项目,用于...

    基于jdbc+servlet+filter的网上投票系统.zip

    【标题】"基于jdbc+servlet+filter的网上投票系统.zip" 涉及到的核心技术是Java Web开发中的三大重要组件:JDBC(Java Database Connectivity)、Servlet和Filter。这是一个典型的Web应用程序,用于实现在线投票的...

    基于XML与FILTER的WEB访问.docx

    随着Web技术的发展,HTML从最初仅用于展示静态文本和图片信息逐渐演变为支持动态内容的载体。动态网页技术的成熟使得Web应用程序的功能日益丰富,同时也带来了新的挑战——如何实现有效的Web页面访问控制。传统的...

    伪静态URLRewrite实例解析

    本文档中介绍了一个基于Java Web的伪静态化方案——UrlRewriteFilter。这是一个强大的开源工具,用于实现URL的重写功能,广泛应用于各种基于Servlet的Web应用中。 **1. 工程搭建** - **项目初始化**:首先创建一个...

    java伪静态URL重写的方法

    下面是一个基于Struts2框架实现伪静态URL重写的详细步骤: 1. **创建项目并引入依赖**:首先,创建一个新的Java Web工程,并导入Struts2框架所需的所有JAR包,包括UrlReswriter.jar。 2. **配置URL重写规则**:...

Global site tag (gtag.js) - Google Analytics