`
ariesmonster
  • 浏览: 17496 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于urlrewrite的网页静态化解决方案

阅读更多
   在互连网应用中,提高页面展示速度和针对搜索引擎优化都是必须要考虑和解决的问题,而解决这两个问题就必须要尽可能实现页面静态化和URL重写.静态化的页面是提高服务器性能最有效的手段之一了,而URL重写又是SEO优化的首要步骤.
   URL重写大部分都在http服务器端操作如apache,但是apache又不能根据参数的不同缓存不同的页面,所以大部分jsp页面都无法被缓存。Google之后发现有个urlrewrite可以在tomcat中重写url, 看过源码之后,决定改造一下,在重写url的同时将内容缓存至磁盘或内存,这样不是一举两得吗。
    (后来又发现,原来还有更好的解决方法http://ariesmonster.iteye.com/blog/807666) 
主要代码如下:
public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		HttpServletResponse httpResponse = (HttpServletResponse) response;

		String originalUrl = httpRequest.getRequestURI();
		if (originalUrl.startsWith(contextPath)) {
			originalUrl = originalUrl.substring(contextPath.length());
		}
		LOG.info("Handle request: {}", originalUrl);
		originalUrl = URLDecoder.decode(originalUrl, "UTF-8");

		Cache cache = memoryCache.get(originalUrl);
		if (cache != null && cache.isValid()) {
			LOG.info("Hit memory cache for request {}", originalUrl);
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().print(cache.getContent());
			return;
		} else if (cache != null) {
			CachedResponse cachedResponse = new CachedResponse(httpResponse);
			RequestDispatcher rd = request.getRequestDispatcher(cache
					.getTargetUrl());
			rd.forward(httpRequest, cachedResponse);

			if (!cachedResponse.isCommitted()
					&& cachedResponse.getStatus() == 200) {
				String responseBody = cachedResponse.getContent();
				response.setContentType("text/html;charset=utf-8");
				response.getWriter().print(responseBody);
				LOG.info("Update memory cache for request {}", cache
						.getTargetUrl());
				cache.setContent(responseBody);
				memoryCache.put(originalUrl, cache);
			}
			return;
		}

		String targetUrl = null;
		Rule matchedRule = null;
		for (Rule rule : rules) {
			targetUrl = rule.execute(originalUrl);
			if (targetUrl != null) {
				matchedRule = rule;
				break;
			}
		}

		if (targetUrl == null) {
			LOG.info("No rule matched request: {}", originalUrl);
			chain.doFilter(request, response);
			return;
		} else {
			short cacheType = matchedRule.getCacheType();
			if (cacheType == 0) {
				LOG.info("Rewrite request {} to {}", originalUrl, targetUrl);
				RequestDispatcher rd = request.getRequestDispatcher(targetUrl);
				rd.forward(request, response);
				return;
			} else if (cacheType == 1) {
				File cacheFile = new File(cacheDir, originalUrl);

				if (isValid(cacheFile, matchedRule.getTimeout())) {
					LOG.info("Hit disk cache for request {}", targetUrl);
					response.setContentType("text/html;charset=utf-8");
					String cacheContent = FileUtils.readFileToString(cacheFile,
							"UTF-8");
					response.getWriter().print(cacheContent);
					return;
				} else {
					CachedResponse cachedResponse = new CachedResponse(
							httpResponse);
					RequestDispatcher rd = request
							.getRequestDispatcher(targetUrl);
					rd.forward(httpRequest, cachedResponse);

					if (!response.isCommitted()
							&& cachedResponse.getStatus() == 200) {
						String responseBody = cachedResponse.getContent();
						response.setContentType("text/html;charset=utf-8");
						response.getWriter().print(responseBody);
						LOG.info("Update disk cache for request {}", targetUrl);
						FileUtils.writeStringToFile(cacheFile, responseBody,
								"UTF-8");
					}

					return;
				}
			} else if (cacheType == 2) {
				CachedResponse cachedResponse = new CachedResponse(httpResponse);
				RequestDispatcher rd = request.getRequestDispatcher(targetUrl);
				rd.forward(httpRequest, cachedResponse);

				if (!response.isCommitted()
						&& cachedResponse.getStatus() == 200) {
					String responseBody = cachedResponse.getContent();
					response.setContentType("text/html;charset=utf-8");
					response.getWriter().print(responseBody);
					LOG.info("Create memory cache for request {}", targetUrl);
					Cache memCache = new Cache();
					memCache.setTimeOut(matchedRule.getTimeout());
					memCache.setContent(responseBody);
					memCache.setTargetUrl(targetUrl);
					memoryCache.put(originalUrl, memCache);
				}

				return;
			}
		}
	}

使用也很简单:
在web.xml中增加
<filter>
		<filter-name>HtmlCache</filter-name>
		<filter-class>com.hanvon.htmlcache.HtmlCacheFilter</filter-class>
		<init-param>
			<param-name>logLevel</param-name>
			<param-value>DEBUG</param-value>
		</init-param>
		<init-param>
			<param-name>cacheDir</param-name>
			<param-value>/data/htmlcache/</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>HtmlCache</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

在WEB-INF下新建配置文件htmlcache.xml
<?xml version="1.0" encoding="utf-8"?>
<urlrewrite>
	<rule>
		<from>/index.html</from>
		<to>/home/index.html</to>
		<cache type="memory" timeout="30" />
                  <!--缓存至内存,刷新间隔30分钟-->
	</rule>
	<rule>
		<from>/category/([0-9]+).html</from>
		<to>/getBookListByCategory.action?clickedCategoryId=$1</to>
		<cache type="memory" timeout="60" />
                  <!--缓存至内存,刷新间隔60分钟-->
	</rule>
	<rule>
		<from>/book/([0-9]+).html</from>
		<to>/showBookDetail.action?bookId=$1</to>
		<cache type="disk" timeout="10" />
                  <!--缓存至磁盘,刷新间隔10分钟-->
	</rule>
	<rule>
		<from>/search/(.*)/(.*).html</from>
		<to>/searchBookByConditionLike.action?searchName=$2&amp;searchType=$1</to>
		<cache type="disk" timeout="60" />
	</rule>
</urlrewrite>
   
改造之后的urlrewrite可以将/book/234.html映射为/book.jsp?id=234,并且缓存至磁盘或内存,测试结果还不错,简单实用
1
0
分享到:
评论

相关推荐

    商业编程-源码-UrlReWrite(Url重写或伪静态)完美示例源码.zip

    UrlRewrite是一个在Web开发中常用的工具,主要用于URL的重写和伪装,即所谓的“伪静态”。这个压缩包文件提供了一套完整的UrlRewrite的源码示例,可以帮助我们深入理解这一技术。以下是对UrlRewrite及其应用的详细...

    UrlReWrite(Url重写或伪静态)完美示例源码

    ActionlessForm解决方案旨在解决这个问题,使得表单可以基于重写后的URL正常工作,而无需显式指定动作。 在实际应用中,UrlRewrite的配置通常在web.config文件中进行。开发者会定义一系列的规则,每条规则包含一个...

    TAG静态化-5.7-亲测可用转拼音

    在IT行业中,静态化是一种常见的优化网站性能的技术,特别是对于基于内容管理系统(CMS)如织梦(DedeCMS)的网站。"TAG静态化-5.7-亲测可用转拼音"这一标题揭示了我们讨论的主题是关于织梦5.7版本的TAG标签静态化,...

    ISAPI Rewrite 2.9 URL伪静态

    ISAPI_Rewrite 2.9 是一款针对IIS(Internet ...总的来说,ISAPI_Rewrite 2.9 是一个强大的工具,能帮助IIS服务器管理员轻松实现URL伪静态,对于追求SEO优化和用户体验提升的网站来说,是一个不可或缺的解决方案。

    IIRF_URLRewrite基于IIS层的IIRF实现URL重写+完美解决POSTBACK问题

    IIRF_URLRewrite提供的解决方案是通过配置规则来确保POSTBACK请求能够正确地路由到原始处理程序,即使URL已经被重写。这样可以保持页面状态的连续性,避免因URL重写而引发的会话丢失或错误跳转。 **技术栈:C#、ASP...

    ECSHOP 伪静态rewrite3 组件

    总结来说,"ECSHOP 伪静态rewrite3 组件"是ECSHOP系统中一个增强型的URL重写工具,它旨在提供更高效、更易用的伪静态解决方案,从而提升网站的SEO效果和用户体验。对于运营ECSHOP电商系统的用户来说,正确配置和利用...

    静态页面生成方案

    ##### 3.1 方法1:基于URLRewrite的静态页面生成 此方法利用URLRewrite技术,将对动态URL(如`.do`结尾的URL)的请求重定向至静态文件或动态生成流程。如果静态文件已存在,则直接提供;否则,生成新文件并返回。 ...

    基于ASP的IIS伪静态文件 v1.0.zip

    【标题】"基于ASP的IIS伪静态文件 v1.0.zip" 提供了一套解决方案,用于在使用IIS(Internet Information Services)作为Web服务器的环境中实现ASP(Active Server Pages)应用程序的伪静态处理。这一版本是v1.0,...

    简单的伪静态,看了很多 自己做了一个简单的jsp的伪静态,和大家分享哈,其实很简单的

    "大家需要的可以下载了看看,很不错的"这部分鼓励感兴趣的读者下载并研究这个解决方案,表明作者认为他的方法具有实用价值。 【标签】“java伪静态”明确了我们讨论的主题,即如何在Java环境中实现伪静态功能。伪...

    .net中用伪静态实现新闻分页

    - IIS URL Rewrite模块是基于服务器的解决方案,适用于各种.NET应用程序。 - ASP.NET的Route类则是在MVC框架中用于处理路由的类,可以自定义URL模式。 3. **使用IIS URL Rewrite模块** - 需要在IIS服务器上安装...

    We7CMS伪静态URL地址设置

    ### We7CMS伪静态URL地址设置...综上所述,We7CMS伪静态URL地址设置提供了灵活多样的解决方案,既可以满足基本的SEO需求,也能适应更为复杂的场景。开发者可以根据自己的实际需求和技术背景来选择最合适的设置方式。

    IIS用的URL_Rewrite插件

    ISAPI_Rewrite是另一个常见的URL重写解决方案,由Helicon Tech开发,兼容IIS。它同样基于正则表达式规则,但提供了更丰富的功能,如日志记录、条件判断等。ISAPI_Rewrite与IIS URL_Rewrite插件在某些场景下可以互换...

    urlrewritefilter-3.2.0下载

    如果在配置或使用过程中遇到错误,这个文档可能会提供解决方案。 "WEB-INF"是Java Web应用程序的标准目录结构的一部分,它包含web.xml(Web应用的部署描述符)和其他不可直接访问的资源,比如类库(JAR文件)和...

    Asp.net生成htm静态文件

    通过以上步骤,我们可以实现一个完整的ASP.NET生成htm静态文件的解决方案。这不仅能够提升用户体验,也能帮助网站在搜索引擎中获得更好的排名。不过,需要注意的是,对于实时性强、交互频繁的网站,过度依赖静态化...

    isapi rewrite 完整版下载

    这个组件使得IIS能够支持类似于Apache服务器上的mod_rewrite功能,从而实现URL的伪静态化,优化网站的SEO(搜索引擎优化)性能。 1. **URL重写**:ISAPI_Rewrite的核心功能是URL重写,它允许管理员通过配置规则,将...

    rewriter 离线版.rar

    总的来说,这个压缩包提供了在IIS服务器上安装和配置URL Rewrite工具的完整解决方案,包括离线安装程序和详细的使用指南,对于管理和优化基于IIS的网站的URL结构非常有帮助。用户可以通过下载、解压并按照说明进行...

    2020T5友价商城源码系统nginx伪静态重写规则.zip

    总的来说,"2020T5友价商城源码系统nginx伪静态重写规则.zip"提供了一个全面的电商解决方案,包含了前端展示、后台管理、支付接口集成、物流处理以及虚拟商品交易等多个方面。对于开发者来说,这是一份宝贵的参考...

    ISAPI_Rewrite3_Lite

    总之,ISAPI_Rewrite3_Lite是一款强大而实用的工具,对于希望优化网站SEO、提升用户体验的IIS用户来说,是一个非常有价值的解决方案。通过熟练掌握其配置和使用,可以有效地改善网站的可访问性和专业形象。

    基于PHP的SK百度知道抓取伪静态缓存极速版php版源码.zip

    这个系统的核心理念是利用PHP抓取百度知道平台上的信息,并将其存储在本地,形成一种静态化的数据缓存,从而避免每次用户请求时都需要实时从远程服务器获取数据,减少了网络延迟,提高了网页加载速度。 首先,我们...

Global site tag (gtag.js) - Google Analytics