• java中的UrlReWriter(url重写)_源码下载


    最近在做的一个项目中用到了url重写。

    ==============================================

    如何增强你网站中地址的可读性和让搜索引擎快速的收录到你的站点,这就需要你美化你的网页的地址,

    也就是我们常说的Url重写技术,大家熟悉的可能有很多服务器都提供Url重写的技术,以前我们用的最多的就是Apache,

    Jboss这样一些服务器自带的一些Url重写,但是他们的配置比较麻烦,性能又不是太好,现在我们有专一的开源框架

    来完成Url重写任务,今天我要介绍的就是UrlRewriter。使用起来比较简单,配置是相当的简单明了。

    我们先简单的了解一下使用Url重写能给你网站带来哪些好处。

      第一:有利于搜索引擎的抓取,因为现在大部分的搜索引擎对动态页面的抓取还比较弱,它们更喜欢抓取一些静态的页面。

        而我们现在的页面大部分的数据都是动态的显示的。这就需要我们把动态页面变成静态的页面,有利于搜索引擎的抓取。

      第二:让用户更容易理解,很少有用户去关心你网站的页面的地址,但对一般的大中型网站增强可读性还是必须的。这样会让你的网站更加完美。

      第三:隐藏技术的实现,我们可以通过Url重写可以实现技术的隐藏。不至于暴露你所采用的技术,给一些想攻击你网站的爱好者提供方便。

      第四:可以很方便的重用,提高网站的移植性。如果我们后台方法改动的话,可以保证前台的页面部分不用改。这样就提高了网站的移植性。

    它虽然有这么多的优点,但是也有一点缺点的,因为它是通过过滤器原理来实现的,就以为着又多了一道访问,会多少影响点访问速度的,这个可以忽略不计的。

    现在UrlRewriter技术有两个技术平台的,一个就是在Java方向的,另一个就是.NET方向的。今天我们讲的是Java方向的应用。

    首先让我们了解它的工作原理,说白了它就是一个简单的过滤器(Filter) ,看看源码你就会很快的明白,它就是通过我们在jsp中常用的两个方法实现的forward(),sendRedirect().

    下面我们就快速的为你的网站搭建Url重写技术。

    以上内容来自:http://blog.csdn.net/gchai/article/details/7874088

    ==============================================

    下面我们就来实现一个的url重写例子:

    准备工作:

    下载:urlrewrite-3.2.0.jar

    可以到这里下载http://code.google.com/p/urlrewritefilter/downloads/list

    我下载的是:urlrewrite-3.2.0.jar

    1.项目结构

    2.运行效果1

    输入:http://localhost:8080/UrlReWriter/name/hongten

    3.运行效果2:

    输入:http://localhost:8080/UrlReWriter/test.html

    不错吧,是不是想自己动手试一试啊.

    ==============================================

    /UrlReWriter/WebContent/WEB-INF/web.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     3     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
     4 
     5     <!-- url重写start -->
     6     <filter>   
     7          <filter-name>UrlRewriteFilter</filter-name>   
     8          <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>   
     9      </filter>   
    10      <filter-mapping>   
    11          <filter-name>UrlRewriteFilter</filter-name>   
    12          <url-pattern>/*</url-pattern>   
    13          <dispatcher>REQUEST</dispatcher>   
    14          <dispatcher>FORWARD</dispatcher>   
    15      </filter-mapping>
    16     <!-- url重写end -->
    17 
    18 
    19     <welcome-file-list>
    20         <welcome-file>index.html</welcome-file>
    21         <welcome-file>index.htm</welcome-file>
    22         <welcome-file>index.jsp</welcome-file>
    23     </welcome-file-list>
    24 </web-app>

    /UrlReWriter/WebContent/WEB-INF/urlrewrite.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2  <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
     3          "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
     4 <!-- Configuration file for UrlRewriteFilter http://tuckey.org/urlrewrite/ -->
     5 <urlrewrite>
     6     <rule>
     7         <from>/test.html</from>
     8         <to type="redirect">%{context-path}/duona.html</to>
     9     </rule>
    10     <rule>
    11         <from>/name/(.*)</from>
    12         <to>/MyName.jsp?name=$1</to>
    13     </rule>
    14 </urlrewrite>

    /UrlReWriter/WebContent/duona.html

     1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     5 <title>多拿网</title>
     6 </head>
     7 <body>
     8  红色字体加粗测试 :<br />
     9 <font color="red" >多拿网,'码'上行动,多拿多优惠</font><br />
    10 测试连接地址:<br />
    11 <a href="http://www.iduona.com" target="_blank">多拿网</a><br />
    12 图片测试:<br />
    13 <img alt="多拿网" src="img/iduona.jpg">
    14 </body>
    15 </html>

    /UrlReWriter/WebContent/test.html

     1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     5 <title>Insert title here</title>
     6 </head>
     7 <body>
     8 this is a test html page!
     9 </body>
    10 </html>

    /UrlReWriter/WebContent/MyName.jsp

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <%
     4 String path = request.getContextPath();
     5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     6 %>
     7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     8 <html>
     9 <head>
    10 <base href="<%=basePath %>"/>
    11 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    12 <title><%=request.getParameter("name")%></title>
    13 </head>
    14 <body>
    15 my name is :<font color="red"> <%=request.getParameter("name")%> </font>,welcome to my zone:<br />
    16 <a href="http://www.cnblogs.com/hongten">http://www.cnblogs.com/hongten</a><br />
    17 <img alt="多拿网" src="img/iduona.jpg">
    18 </body>
    19 </html>

    ==============================================

    下面和大家分享一下:org.tuckey.web.filters.urlrewrite.sample包下面的一些源代码

    org.tuckey.web.filters.urlrewrite.sample.SampleConfExt.class

     1 package org.tuckey.web.filters.urlrewrite.sample;
     2 
     3 import org.tuckey.web.filters.urlrewrite.Conf;
     4 import org.w3c.dom.Document;
     5 
     6 import java.io.InputStream;
     7 
     8 
     9 public class SampleConfExt extends Conf {
    10 
    11     public SampleConfExt() {
    12         // do something
    13     }
    14 
    15     protected synchronized void loadDom(InputStream inputStream) {
    16         // do something
    17         super.loadDom(inputStream);
    18     }
    19 
    20     protected void processConfDoc(Document doc) {
    21         // do something else
    22         super.processConfDoc(doc);
    23     }
    24 }

    org.tuckey.web.filters.urlrewrite.sample.SampleMultiUrlRewriteFilter.class

     1 package org.tuckey.web.filters.urlrewrite.sample;
     2 
     3 import org.tuckey.web.filters.urlrewrite.Conf;
     4 import org.tuckey.web.filters.urlrewrite.UrlRewriteFilter;
     5 import org.tuckey.web.filters.urlrewrite.UrlRewriter;
     6 
     7 import javax.servlet.FilterChain;
     8 import javax.servlet.FilterConfig;
     9 import javax.servlet.ServletException;
    10 import javax.servlet.ServletRequest;
    11 import javax.servlet.ServletResponse;
    12 import java.io.FileInputStream;
    13 import java.net.URL;
    14 import java.util.ArrayList;
    15 import java.util.List;
    16 
    17 /**
    18  * Sample of how you might load multiple configuration files. (NOT to be used verbatim!!)
    19  */
    20 public class SampleMultiUrlRewriteFilter extends UrlRewriteFilter {
    21 
    22     private List urlrewriters = new ArrayList();
    23      
    24     public void loadUrlRewriter(FilterConfig filterConfig) throws ServletException {
    25         // add configurations
    26         try {
    27             Conf conf1 = new Conf(filterConfig.getServletContext(), new FileInputStream("someconf.xml"), "someconf.xml", "");
    28             urlrewriters.add(new UrlRewriter(conf1));
    29 
    30             Conf conf2 = new SampleConfExt();
    31             urlrewriters.add(new UrlRewriter(conf2));
    32 
    33         } catch (Exception e) {
    34             throw new ServletException(e);
    35         }
    36     }
    37 
    38     public UrlRewriter getUrlRewriter(ServletRequest request, ServletResponse response, FilterChain chain) {
    39         // do some logic to decide what urlrewriter to use (possibly do a reload check on the conf file)
    40         return (UrlRewriter) urlrewriters.get(0);
    41     }
    42 
    43     public void destroyUrlRewriter() {
    44         for (int i = 0; i < urlrewriters.size(); i++) {
    45             UrlRewriter urlRewriter = (UrlRewriter) urlrewriters.get(i);
    46             urlRewriter.destroy();
    47         }
    48     }
    49 
    50 }

    org.tuckey.web.filters.urlrewrite.sample.SampleRewriteMatch.class

     1 /**
     2  * Copyright (c) 2005-2007, Paul Tuckey
     3  * All rights reserved.
     4  * ====================================================================
     5  * Licensed under the BSD License. Text as follows.
     6  *
     7  * Redistribution and use in source and binary forms, with or without
     8  * modification, are permitted provided that the following conditions
     9  * are met:
    10  *
    11  *   - Redistributions of source code must retain the above copyright
    12  *     notice, this list of conditions and the following disclaimer.
    13  *   - Redistributions in binary form must reproduce the above
    14  *     copyright notice, this list of conditions and the following
    15  *     disclaimer in the documentation and/or other materials provided
    16  *     with the distribution.
    17  *   - Neither the name tuckey.org nor the names of its contributors
    18  *     may be used to endorse or promote products derived from this
    19  *     software without specific prior written permission.
    20  *
    21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
    24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
    25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
    26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
    27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
    31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    32  * POSSIBILITY OF SUCH DAMAGE.
    33  * ====================================================================
    34  */
    35 package org.tuckey.web.filters.urlrewrite.sample;
    36 
    37 import org.tuckey.web.filters.urlrewrite.extend.RewriteMatch;
    38 
    39 import javax.servlet.RequestDispatcher;
    40 import javax.servlet.ServletException;
    41 import javax.servlet.http.HttpServletRequest;
    42 import javax.servlet.http.HttpServletResponse;
    43 import java.io.IOException;
    44 
    45 
    46 /**
    47  * A sample of how you might write a custom match.
    48  */
    49 class SampleRewriteMatch extends RewriteMatch {
    50     private int id;
    51 
    52     SampleRewriteMatch(int i) {
    53         id = i;
    54     }
    55 
    56     int getId() {
    57         return id;
    58     }
    59 
    60     public boolean execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    61 
    62         // lookup things in the db based on id
    63 
    64         // do something like forward to a jsp
    65         request.setAttribute("sampleRewriteMatch", this);
    66         RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/some-view.jsp");
    67         rd.forward(request, response);
    68         // in the jsp you can use request.getAttribute("sampleRewriteMatch") to fetch this object
    69 
    70         return true;
    71     }
    72 
    73 }

    org.tuckey.web.filters.urlrewrite.sample.SampleRewriteRule.class

     1 /**
     2  * Copyright (c) 2005-2007, Paul Tuckey
     3  * All rights reserved.
     4  * ====================================================================
     5  * Licensed under the BSD License. Text as follows.
     6  *
     7  * Redistribution and use in source and binary forms, with or without
     8  * modification, are permitted provided that the following conditions
     9  * are met:
    10  *
    11  *   - Redistributions of source code must retain the above copyright
    12  *     notice, this list of conditions and the following disclaimer.
    13  *   - Redistributions in binary form must reproduce the above
    14  *     copyright notice, this list of conditions and the following
    15  *     disclaimer in the documentation and/or other materials provided
    16  *     with the distribution.
    17  *   - Neither the name tuckey.org nor the names of its contributors
    18  *     may be used to endorse or promote products derived from this
    19  *     software without specific prior written permission.
    20  *
    21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
    24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
    25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
    26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
    27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
    31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    32  * POSSIBILITY OF SUCH DAMAGE.
    33  * ====================================================================
    34  */
    35 package org.tuckey.web.filters.urlrewrite.sample;
    36 
    37 import org.tuckey.web.filters.urlrewrite.extend.RewriteRule;
    38 import org.tuckey.web.filters.urlrewrite.extend.RewriteMatch;
    39 
    40 import javax.servlet.http.HttpServletRequest;
    41 import javax.servlet.http.HttpServletResponse;
    42 
    43 /**
    44  * A sample of how you might write a custom rule.
    45  */
    46 public class SampleRewriteRule extends RewriteRule {
    47 
    48 
    49     public RewriteMatch matches(HttpServletRequest request, HttpServletResponse response) {
    50 
    51         // return null if we don't want the request
    52         if (!request.getRequestURI().startsWith("/staff/")) return null;
    53 
    54         Integer id = null;
    55         try {
    56             // grab the things out of the url we need
    57             id = Integer.valueOf(request.getRequestURI().replaceFirst(
    58                 "/staff/([0-9]+)/", "$1"));
    59         } catch (NumberFormatException e) {
    60             // if we don't get a good id then return null
    61             return null;
    62         }
    63 
    64         // match required with clean parameters
    65         return new SampleRewriteMatch(id.intValue());
    66     }
    67 
    68 }

    还有:org.tuckey.web.filters.urlrewrite包下面的conf-dist.xml文件

    /org/tuckey/web/filters/urlrewrite/conf-dist.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
     3         "http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
     4 
     5 <!--
     6 
     7     Configuration file for UrlRewriteFilter
     8     http://tuckey.org/urlrewrite/
     9 
    10 -->
    11 <urlrewrite>
    12 
    13     <rule>
    14         <note>
    15             The rule means that requests to /test/status/ will be redirected to /rewrite-status
    16             the url will be rewritten.
    17         </note>
    18         <from>/test/status/</from>
    19         <to type="redirect">%{context-path}/rewrite-status</to>
    20     </rule>
    21 
    22 
    23     <outbound-rule>
    24         <note>
    25             The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
    26             the url /rewrite-status will be rewritten to /test/status/.
    27 
    28             The above rule and this outbound-rule means that end users should never see the
    29             url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
    30             in your pages.
    31         </note>
    32         <from>/rewrite-status</from>
    33         <to>/test/status/</to>
    34     </outbound-rule>
    35 
    36 
    37     <!--
    38 
    39     INSTALLATION
    40 
    41         in your web.xml add...
    42 
    43         <filter>
    44             <filter-name>UrlRewriteFilter</filter-name>
    45             <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    46             <init-param>
    47                 <param-name>logLevel</param-name>
    48                 <param-value>WARN</param-value>
    49             </init-param>
    50         </filter>
    51         <filter-mapping>
    52             <filter-name>UrlRewriteFilter</filter-name>
    53             <url-pattern>/*</url-pattern>
    54         </filter-mapping>
    55 
    56      EXAMPLES
    57 
    58      Redirect one url
    59         <rule>
    60             <from>/some/old/page.html</from>
    61             <to type="redirect">/very/new/page.html</to>
    62         </rule>
    63 
    64     Redirect a directory
    65         <rule>
    66             <from>/some/olddir/(.*)</from>
    67             <to type="redirect">/very/newdir/$1</to>
    68         </rule>
    69 
    70     Clean a url
    71         <rule>
    72             <from>/products/([0-9]+)</from>
    73             <to>/products/index.jsp?product_id=$1</to>
    74         </rule>
    75     eg, /products/1234 will be passed on to /products/index.jsp?product_id=1234 without the user noticing.
    76 
    77     Browser detection
    78         <rule>
    79             <condition name="user-agent">Mozilla/[1-4]</condition>
    80             <from>/some/page.html</from>
    81             <to>/some/page-for-old-browsers.html</to>
    82         </rule>
    83     eg, will pass the request for /some/page.html on to /some/page-for-old-browsers.html only for older
    84     browsers whose user agent srtings match Mozilla/1, Mozilla/2, Mozilla/3 or Mozilla/4.
    85 
    86     Centralised browser detection
    87         <rule>
    88             <condition name="user-agent">Mozilla/[1-4]</condition>
    89             <set type="request" name="browser">moz</set>
    90         </rule>
    91     eg, all requests will be checked against the condition and if matched
    92     request.setAttribute("browser", "moz") will be called.
    93 
    94     -->
    95 
    96 </urlrewrite>

    总结:有没理解它的工作原理,说白了它就是一个简单的过滤器(Filter) ,看看源码你就会很快的明白,

    它就是通过我们在jsp中常用的两个方法实现的forward(),sendRedirect().

    项目源码下载:https://files.cnblogs.com/hongten/UrlReWriter.rar

  • 相关阅读:
    人工智能技术导论——博弈树搜索
    人工智能技术导论——基于产生式规则的机器推理
    人工智能技术导论——基于遗传算法的随机优化搜索
    人工智能技术导论——使用PROLOG逻辑语言解决爱因斯坦斑马问题
    人工智能技术导论——逻辑程序设计语言PROLOG
    操作系统——页面调度算法
    操作系统——页式存储管理
    人工智能技术导论复习大纲
    计算机图形学复习大纲
    算法设计与分析——算法复杂性分析
  • 原文地址:https://www.cnblogs.com/hongten/p/java_urlrewriter.html
Copyright © 2020-2023  润新知