`

通过urlrewrite和filter实现动态网站生成静态页并缓存的方案

    博客分类:
  • java
阅读更多

关于改造动态网站为生成静态页的方案

 

 

<!----><!----> <!---->

url 重写的好处 :

<!---->一, <!---->可以方便的实现对化化引擎的优化,并且比生成静态 更加方便。

<!---->二, <!---->占空间比较小。

<!---->三, <!---->首页每天都自动变化,不用维护。


1. 通过urlrewrite 进行静态页生成及缓存. http://tuckey.org/urlrewrite/ 下载.
2. 添加urlrewrite.xml配置文件到webroot/WEB-INF/下;添加urlrewrite-XXX.jar到webroot/WEB-INF/lib下;
3. 修改urlrewrite.xml为
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
        "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">

<urlrewrite>

    <rule>
        <from>^/index.html$</from>
        <to>/index.jsp</to>
    </rule>
   
    <rule>
        <from>^/product/detail-([0-9]+)\.html$</from>
        <to>/controler/PageControler?param=chan1=$1&page=productDetail.do</to>
    </rule>
<rule>
        <from>^/catalog/list-p-([0-9]+)-([0-9]+)\.html$</from>
        <to>/controler/PageControler?param=cataId=$1_cur=$2&page=productCatalogList.do</to>
    </rule>

    <outbound-rule>
        <from>/index.jsp</from>
        <to>index.html</to>
    </outbound-rule>


</urlrewrite>
关于urlrewrite的配置参见urlrewrite相关doc.
4. 新建过滤器HtmlCatchFilter用来检查静态页
import java.io.File;
import java.io.IOException;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HtmlCatchFilter implements Filter {

// 定义公用变量
public final static String staticRootUrl = "/WEB-INF/staticdoc/";
public final static String webroot = "D:/webroot";
public final static long overtime = 1000 * 60;// 一分钟为过期时间

public void destroy() {
System.out.println(getClass().getName() + "  destroy!");
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println(getClass().getName() + " doFilter!");

String param = request.getParameter("param");
System.out.println("参数集合:" + param);

String page = request.getParameter("page");

String newUrl = page + "_" + param + ".html";

File file = new File(webroot + staticRootUrl + newUrl);
if (file.exists()) {
System.out.print("文件最后修改时间:");
System.out.println(new Date(file.lastModified()));
long lastModified = file.lastModified();
long currently = System.currentTimeMillis();
System.out.println(new Date(currently));
System.out.println("lastModified:" + lastModified + "|currently:"
+ currently + "|时间差:" + (currently - lastModified));
if (currently - lastModified > overtime) {
System.out.println("静态文件" + newUrl
+ "过期!转到PageControlerServlet进行生成");
chain.doFilter(request, response);
}
System.out.println("静态文件存在,并且是可用的,转到静态文件" + staticRootUrl + newUrl);
request.getRequestDispatcher(staticRootUrl + newUrl).forward(
request, response);
} else {
System.out.println("静态文件" + newUrl
+ "不存在!转到PageControlerServlet进行生成");
chain.doFilter(request, response);
}

}

public void init(FilterConfig arg0) throws ServletException {
System.out.println(getClass().getName() + " init!");

}

}

5. 新建servlet,用来生成静态页.
PageControlerServlet.java
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


public class PageControlerServlet implements Servlet {

public void destroy() {
System.out.println(getClass().getName() + " destroy");
}

public ServletConfig getServletConfig() {
System.out.println(getClass().getName() + " getServletConfig");
return null;
}

public String getServletInfo() {
System.out.println(getClass().getName() + " getServletInfo");
return null;
}

public void init(ServletConfig arg0) throws ServletException {
System.out.println(getClass().getName() + " init");

}

public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println(getClass().getName() + " service");
System.out.println("param="+request.getParameter("param"));
//通过此servlet来进行静态文件的生成和有效性检查.
System.out.println("=======进行生成静态文件处理,生成结束并转到静态页");

String param = request.getParameter("param");
System.out.println("参数集合:" + param);


String page = request.getParameter("page");

String newUrl =  page +"_"+param+".html";


String newFileName = HtmlCatchFilter.webroot+HtmlCatchFilter.staticRootUrl+newUrl;

String str = "生成的新的静太文件内容";
String params = param.replace('_', '&');
System.out.println("请求动态参数:"+params);

str = str + "请求:"+page+"?"+params+"取得页面内容";

FileOutputStream fos = new FileOutputStream(newFileName);
Writer out = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(out);
// 将字符串写入文件
bw.write(str);
bw.flush();// 将数据更新至文件
fos.close();// 关闭文件流
System.out.println("生成新的文件结束,并转向静态文件!");
request.getRequestDispatcher(HtmlCatchFilter.staticRootUrl+newUrl).forward(request, response);
}

}


6. 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
 
  <!-- UrlRewriteFilter config start -->
  <filter>                                      
     <filter-name>UrlRewriteFilter</filter-name>
     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
  </filter>              
  <filter-mapping>       
     <filter-name>UrlRewriteFilter</filter-name>                             
     <url-pattern>*.html</url-pattern>                          
  </filter-mapping>
  <!-- UrlRewriteFilter config end -->
 
  
 
  <!-- HtmlCacheFilter config start -->
  <filter>
    <filter-name>HtmlCacheFilter</filter-name>
    <filter-class>HtmlCatchFilter</filter-class>      
  </filter>
  <filter-mapping>   
    <filter-name>HtmlCacheFilter</filter-name>      
    <url-pattern>/controler/*</url-pattern>                               
<dispatcher>FORWARD</dispatcher>                             
  </filter-mapping>
<!-- HtmlCacheFilter config end -->

  <servlet>
    <servlet-name>PageControlerServlet</servlet-name>
    <servlet-class>PageControlerServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>PageControlerServlet</servlet-name>
    <url-pattern>/controler/PageControler</url-pattern>
  </servlet-mapping>
</web-app> 
7. 测试;
访问http://localhost/catalog/list-p-1-2.html  在/WEB-INF/staticdoc/目录下生成productCatalogList.do_cataId=1_cur=2.html 静态文件,扩展上边demo可以改造成生成目录和文件过期时间可配的.来实现改造现有网站的静态化方案.

 

 

分享到:
评论
2 楼 aning543 2009-07-25  
在刷新周期60秒之后, 在次访问报:Cannot forward after response has been committed
在传递过滤器链之后return,让PageControlerServlet重新生成静态文件
1 楼 surpass_li 2008-10-13  
添加squid缓存和urlrewrite伪静态配合也可以实现优化的目的。

相关推荐

    Java 生成静态页

    这通常通过Apache的mod_rewrite模块或者Java的Filter实现,将请求从动态路径转向静态文件。 5. **缓存策略**:生成的静态页应当设置合适的缓存策略,比如HTTP头中的Cache-Control和Expires字段,以充分利用浏览器的...

    java JSP页面静态化总结_动态页面变为静态页面以减少访问数据库的次数提高速度.zip

    - **URLRewrite实现URL伪静态化**:通过URLRewrite工具,可以改变URL的展示形式,使其看起来像静态页面,但实际仍由动态页面处理。这种方法并不真正生成静态文件,但在用户看来,URL更简洁,更像静态页面。 4. **...

    静态地址和静态URL

    静态URL(Static URL)是指一种网站页面的访问路径设计模式,其目的是使网站的URL更加简洁、易于记忆,并有助于提升用户体验和搜索引擎优化(SEO)。在互联网中,我们常见的以`.html`或者`.htm`结尾的URL,实际上很...

    jsp实现URL伪静态.rar

    URL伪静态是网站优化的一个重要技术手段,它主要应用于动态网站,使得原本的动态URL展现为静态页面的格式,从而提高用户体验,优化搜索引擎的抓取效率。本资料"jsp实现URL伪静态.rar"将详细介绍如何在JSP环境下实现...

    java/jsp网站实现伪静态

    Java/JSP网站实现伪静态是一种优化网站性能和搜索引擎优化(SEO)的方法,它将动态页面的URL转换为静态或看似静态的格式,如.html。这样做可以提高网站的加载速度,减少服务器负担,并使搜索引擎更容易抓取和理解...

    Spring MVC 配置 urlrewrite 实例

    &lt;filter-class&gt;org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;dispatcher&gt;...

    iis6de伪静态配置放大及静态文件

    伪静态技术是一种通过URL重写技术将动态网页的URL转换为静态或看似静态的URL形式,从而提高搜索引擎友好性和用户体验。对于IIS6来说,实现伪静态主要依赖于ISAPI筛选器或HTTP模块,如Microsoft的URL Rewrite Module...

    spring+springmvc+mybatis项目案例实现用户角色权限管理

    使用spring+springmvc框架 ...使用了urlrewrite filter进行地址重写,实现伪静态页面 使用了sitemesh对网页进行布局和修饰 使用了loginFilter对访问进行登录过滤 使用了CheckCodeServlet生成验证码图片

    在Nginx中配置image filter模块来实现动态生成缩略图

    要实现在URL中通过尺寸参数动态生成缩略图,可以在`server`上下文中添加如下配置: ```nginx location ~* /img/(.+)_(\d+)x(\d+).(jpg|gif|png)$ { set $h $2; set $w $3; if ($h = "0") { rewrite /img/...

    关于页面优化和伪静态

    3. 正则表达式:正则表达式在伪静态中扮演关键角色,用于匹配和解析URL,实现动态URL到静态URL的映射。掌握正则表达式能够让你更好地定制和优化URL规则。 通过以上方法,可以有效地优化网页的加载速度,提高搜索...

    IIRF IsapiRewrite4

    这些规则通常以正则表达式为基础,能够灵活地匹配和转换URL,使得动态生成的网页可以展现出静态化的、更友好的格式,同时也能帮助提高搜索引擎优化(SEO)的效果。 例如,你可以使用IIRF来将一个复杂的查询字符串...

    RQCMS 2.4.zip

    通过修改此文件,可以设置规则将动态URL转化为静态形式,从而提高网站性能并有利于SEO。 3. `Iirf.ini`:这可能是一个IIRF(Internet Information Server URL Rewrite Filter)配置文件,与`.htaccess`类似,用于...

    IIRF2.1免费的重定向软件

    这款软件的主要目标是允许管理员对网站的URL进行重写和路由,以及执行高级访问控制策略,而无需购买商业解决方案,如ISAPI_Rewrite3的免费版。 **URL重写** URL重写是网站优化和管理的关键技术之一,它允许你将复杂...

    带完整详细目录:Nginx高性能Web服务器详解+深入理解Nginx:模块开发与架构解析(第2版)陶辉著

    - URL重写规则:通过rewrite指令实现URL的动态转换,优化SEO或实现路径映射。 - 访问控制:基于IP、用户代理、基本认证等方式限制访问权限。 6. **日志管理** - 日志格式定制:自定义Nginx的日志格式,方便进行...

    实战nginx-全

    3. **URL重写**:借助`rewrite`规则进行URL转换,实现动态路由。 4. **SSL/TLS**:配置SSL证书,启用HTTPS,保护数据传输安全。 5. **限速与限流**:使用`limit_rate`和`limit_conn`限制客户端的请求速率和连接数,...

    nginx-1.25.1

    4. **缓存功能**:Nginx支持静态文件缓存,减少对源服务器的请求,提高响应速度。 ### 安装Nginx 1.25.1 on Linux 在Linux系统中,通常通过包管理器(如`apt`或`yum`)安装Nginx,但为了获取最新版本,我们可能...

    Nginx常见应用技术指南(nginx-tips)

    Rewrite规则和Redirect重定向用于控制URL的处理和访问重定向。自动添加目录斜线用于处理不规范的URL访问请求。Location指令用于配置请求的路由规则,它定义了Nginx如何处理进入的HTTP请求。expires指令可以控制HTTP...

    nginx开源代码

    Nginx的过滤器机制允许在响应生成过程中进行数据处理,例如压缩、缓存等。`ngx_http_filter_module`是基础过滤器模块,其他模块可以在此基础上添加过滤功能。 通过对Nginx开源代码的学习,开发者可以掌握网络编程...

Global site tag (gtag.js) - Google Analytics