前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java中的UrlReWriter(url重写)_源码下载

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

作者头像
Hongten
发布2018-09-13 15:49:07
2K0
发布2018-09-13 15:49:07
举报
文章被收录于专栏:HongtenHongten

最近在做的一个项目中用到了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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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().

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-11-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档