登陆 | 注册
你现在的位置:我的论坛 >> java >> java 版和C# 版 UrlRewriter 的实现方法
java 版和C# 版 UrlRewriter 的实现方法
java 版UrlRewriter 的实现
web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
<filter>
        
<filter-name>urlRewriter</filter-name>
        
<filter-class>dang.web.UrlRewriter</filter-class>
    
</filter>
    
<filter-mapping>
        
<filter-name>urlRewriter</filter-name>
        
<url-pattern>*.jhtml</url-pattern>
        
<dispatcher>REQUEST</dispatcher>
    
</filter-mapping>
</web-app>
UrlRewriter.java
package dang.web;

import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document; 
import org.w3c.dom.Element;
import org.w3c.dom.NodeList; 
import org.w3c.dom.Node;


public class UrlRewriter implements Filter
{
    
private static List<UrlPattern> urlpattern_list = null;
    
    
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
    
{
        
if(urlpattern_list==null)
            getPatternListFromResource();
        
        String path 
= getFullRequestInfo((HttpServletRequest)request);
        
for(UrlPattern up : urlpattern_list)
        
{
            
if(up.isMatch(path))
                 request.getRequestDispatcher(up.replace(path)).forward(request, response);
        }

    }

    
    
private static void getPatternListFromResource()
    
{
        Document xdoc 
= null;
        
        
try
        
{
            InputStream stream 
= UrlRewriter.class.getResourceAsStream("/w.xml");
            xdoc 
= DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream);
        }
 
        
catch (Exception e)
        
{

        }

        
        
if(xdoc==null)
            
return;
        
        NodeList list 
= xdoc.getDocumentElement().getChildNodes();
        urlpattern_list 
= new ArrayList<UrlPattern>();
        
        
int i,len=list.getLength();
        
        
for(i=0;i<len;i++)
        
{
            Node n 
= list.item(i);
            
if(n.getNodeType()==Node.ELEMENT_NODE)
            
{
                Element e 
= (Element)n;
                UrlPattern up 
= new UrlPattern(e.getAttribute("find"), e.getAttribute("to"));
                urlpattern_list.add(up);
            }

        }

    }

    
    
private static String getFullRequestInfo(HttpServletRequest request)
    
{
         String url 
= request.getRequestURI();
         String para 
= request.getQueryString();
         
return para==null?url:url.concat("?").concat(para);
    }

    
    
public void destroy(){}

    
public void init(FilterConfig filterConfig){}
}


 
class UrlPattern
{
    
//<editor-fold defaultstate="collapsed" desc="UrlPattern class">
    private Pattern p;
    
private String to;
    
    
public UrlPattern(String find,String to)
    
{
        
this.p=Pattern.compile(find);
        
this.to = to;
    }

    
    
public String replace(String path)
    
{
        
return p.matcher(path).replaceAll(to);
    }

    
    
public boolean isMatch(String path)
    
{
        
return p.matcher(path).matches();
    }

     
//</editor-fold>
}
C#版UrlRewriter 的实现
web.config
 <?xml version="1.0"?>
<configuration>
  
<configSections>
    
<section name="urlRewriter" type="System.Configuration.IgnoreSectionHandler"/>
  
</configSections>
  
<urlRewriter>
    
<add find="^/(\d+).aspx$" to="/product.aspx?page_index=$1&amp;page_size=5"/>
  
</urlRewriter>
    
<system.web>
        
<httpModules>
          
<add name="urlRewriter" type="Dang.Web.HttpModule.UrlRewriter,Dang.Web"/>
        
</httpModules>
    
</system.web>
</configuration>

UrlRewriter
.cs
  using System;
using System.Web;
using System.Xml;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
using System.Configuration;

namespace BBS.Core
{
    
public class UrlRewriter : IHttpModule
    
{
        
private static UrlRegex[] regArray = null;

        
static UrlRewriter()
        
{
            XmlDocument xmlDoc 
= new XmlDocument();
            xmlDoc.Load(
string.Concat(AppDomain.CurrentDomain.BaseDirectory,"web.config"));
            XmlNodeList nodeList 
= xmlDoc.SelectNodes("/configuration/urlRewriter/add");

            
int j = nodeList.Count;
            regArray 
= new UrlRegex[j];

            
for (int i = 0; i < j; i++)
                regArray[i] 
= new UrlRegex(nodeList[i].Attributes["find"].Value, nodeList[i].Attributes["to"].Value);
        }


        
public void Dispose()
        
{
        }


        
public void Init(HttpApplication context)
        
{
            context.BeginRequest 
+= new System.EventHandler(context_BeginRequest);
        }


        
void context_BeginRequest(object sender, System.EventArgs e)
        
{
            HttpContext context 
= ((HttpApplication)sender).Context;
            
string url = context.Request.RawUrl;
            
foreach (UrlRegex reg in regArray)
                
if (reg.IsMatch(url))
                    context.RewritePath(reg.Replace(url));
        }

    }



    
public class UrlRegex
    
{
        
private Regex reg = null;
        
private string find = null;
        
private string to = null;

        
public UrlRegex(string find, string to)
        
{
            
this.reg = new Regex(find, RegexOptions.IgnoreCase);
            
this.find = find;
            
this.to = to;
        }


        
public string Replace(string input)
        
{
            
return this.reg.Replace(input, this.to);
        }


        
public bool IsMatch(string input)
        
{
            
return this.reg.IsMatch(input);
        }

    }

}
 
楼主 创建:08-06-02 11:20:00 更新:08-06-02 11:20:00
发表回复

1/1(共1页)
大狗熊

上面 的 java 版的 UrlRewriter 也可以用Servlet 实现 代码类似

    <servlet>
        <servlet-name>urlRewriter</servlet-name>
        <servlet-class>dang.web.UrlRewriter</servlet-class>
    </servlet>
   
   
<servlet-mapping>
        <servlet-name>urlRewriter</servlet-name>
        <url-pattern>*.jhtml</url-pattern>
    </servlet-mapping>

1楼 创建:08-06-02 15:22:19 更新:08-06-02 15:22:19
发表回复
1 共1条
Copyright (C) 2004-2008, All Rights Reserved