环境:
Maven: apache-maven-3.3.3
Urlrewrite 3.1.0
Myeclipse 10
Maven: apache-maven-3.3.3
Urlrewrite 3.1.0
Myeclipse 10
使用Url重写能给你网站带来哪些好处呢?
第一:有利于搜索引擎的抓取,因为现在大部分的搜索引擎对动态页面的抓取还比较弱,它们更喜欢抓取一些静态的页面。而我们现在的页面大部分的数据都是动态的显示的。这就需要我们把动态页面变成静态的页面,有利于搜索引擎的抓取
第二:让用户更容易理解,很少有用户去关心你网站的页面的地址,但对一般的大中型网站增强可读性还是必须的。这样会让你的网站更加完美
第三:隐藏技术的实现,我们可以通过Url重写可以实现技术的隐藏。不至于暴露你所采用的技术,给一些想攻击你网站的爱好者提供方便
第四:可以很方便的重用,提高网站的移植性。如果我们后台方法改动的话,可以保证前台的页面部分不用改。这样就提高了网站的移植性。
它虽然有这么多的优点,但是也有一点缺点的,因为它是通过过滤器原理来实现的,就意味着又多了一道访问,会多少影响点访问速度的,但这个可以忽略不计"
-----摘自网络
一、Tomcat的过滤器
最典型的就是用urlReweite的类库。如果有经验,自己写也不是很麻烦。也可以用现成的开源的免费的urlrewrite filter. http://tuckey.org/urlrewrite/下载
二、使用Apache的mod
# 去掉这个前面的#,启用它
LoadModule rewrite_module modules/mod_rewrite.so<VirtualHost _default_:80>
# 其它的配置数据RewriteEngine On
# 下面三行实现动态解析
RewriteRule ^/viewthread/(/d+).htm$ /viewthread.jsp?id=$1 [L,PT]
</VirtualHost>
三、使用系统的404错误进行
也就是页面没找到的错误,使用了404的错误处理页面来页面转发
第一种修改麻烦,但对于平稳运行的系统,是个不错的选择
第二种需要配置Apache,但 Apache的重启速度很快,适合于有可能经常变得情况,而且Apache Mod的效率还是不错的
第三种最灵活,一般简单的应用可以用这个。
本次采用第一种Tomcat的过滤器urlReweite
首先引入maven库
<!-- URL Rewrite -->
<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
<version>3.1.0</version>
</dependency>
在WEB-INF目录下建一个urlrewrite.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<urlrewrite>
<rule>
<note>首页</note>
<from>/index.html</from>
<to type="forward">/index.do</to>
</rule>
</urlrewrite>
urlrewrite.xml详解:
<!--
<rule>
<note>重写index.jsp成index.html</note>
<note>example:/index.html</note>
<from>/index.html</from>
<to type="forward">/index.jsp</to>
</rule>
<rule>
<note>将view根目录下所有jsp资源重写成/xxx.action</note>
<note>example:/index.action</note>
<from>/([A-Za-z0-9]+).action</from>
<to type="forward">/view/$1.jsp</to>
</rule>
<rule>
<note>forward(转发模式)传参</note>
<note>example:/user/param/fancy/8080.do</note>
<from>/user/([A-Za-z0-9]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+).do</from>
<to type="forward">/view/parameter/$1.jsp?username=$2&password=$3</to>
</rule>
<rule>
<note>redirect(重定向模式)传参,to中写绝对地址</note>
<note>example:/admin/param/fancy/8080.do</note>
<from>/admin/([A-Za-z0-9]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+).do</from>
<to type="redirect">/urlrewrite-maven-example/view/parameter/$1.jsp?username=$2&password=$3</to>
</rule>
urlrewrite.xml 这个配置文件一定只能放在 WEB-INF 下,放别的地方,无论你在web.xml中怎么配置都是不行的,至少现在是不行的。
所谓重写,就一定会有规则的匹配,这里用到了正则表达式,方便起见,我只用了[A-Za-z0-9]+,简单的解释一下:
A-Z:匹配 A 到 Z 中的任意一个字符,说一句废话,同理可得,
a-z:匹配 a 到 z 中的任意一个字符
0-9:匹配 0 到 9 的任意一个字符
+:至少出现一次,即,一次或一次以上
合起来 [A-Za-z0-9]+ 的意思就是:匹配一个任意的英文字母和数字组合的字符串
<rule>:自定义匹配规则
<note>:注释,解释标签
<from>:定义具体的匹配规则
<to>:匹配成功后的目标地址
<to type="">:type的值有两个,一个是 forward (转发,参数不丢失),一个是 redirect (重定向,地址栏显示的地址就是目标真实地址)
$1:匹配中的第一个正则表达式的字符串的值,$2,$3,$4....也是如此
& :是 & 的实体名,代表的就是 &,这个可以在 w3school 中找到:http://www.w3school.com.cn/tags/html_ref_entities.html
第一个rule:访问 /index.html,实际上是访问了 /index.jsp
第二个rule:访问 /xx.action , 实际上是访问了 view 目录下的 xx.jsp
第三个rule:访问 /user/xx/yy/zz.do , 实际上是访问了 view 目录下的 parameter 目录下的 xx.jsp?username=yy&password=zz
第四个rule:跟第三个其实是一样的,但是由于是重定向模式,所以地址栏就会显示真的是地址
-->
<!--
<rule>
<note>重写index.jsp成index.html</note>
<note>example:/index.html</note>
<from>/index.html</from>
<to type="forward">/index.jsp</to>
</rule>
<rule>
<note>将view根目录下所有jsp资源重写成/xxx.action</note>
<note>example:/index.action</note>
<from>/([A-Za-z0-9]+).action</from>
<to type="forward">/view/$1.jsp</to>
</rule>
<rule>
<note>forward(转发模式)传参</note>
<note>example:/user/param/fancy/8080.do</note>
<from>/user/([A-Za-z0-9]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+).do</from>
<to type="forward">/view/parameter/$1.jsp?username=$2&password=$3</to>
</rule>
<rule>
<note>redirect(重定向模式)传参,to中写绝对地址</note>
<note>example:/admin/param/fancy/8080.do</note>
<from>/admin/([A-Za-z0-9]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+).do</from>
<to type="redirect">/urlrewrite-maven-example/view/parameter/$1.jsp?username=$2&password=$3</to>
</rule>
urlrewrite.xml 这个配置文件一定只能放在 WEB-INF 下,放别的地方,无论你在web.xml中怎么配置都是不行的,至少现在是不行的。
所谓重写,就一定会有规则的匹配,这里用到了正则表达式,方便起见,我只用了[A-Za-z0-9]+,简单的解释一下:
A-Z:匹配 A 到 Z 中的任意一个字符,说一句废话,同理可得,
a-z:匹配 a 到 z 中的任意一个字符
0-9:匹配 0 到 9 的任意一个字符
+:至少出现一次,即,一次或一次以上
合起来 [A-Za-z0-9]+ 的意思就是:匹配一个任意的英文字母和数字组合的字符串
<rule>:自定义匹配规则
<note>:注释,解释标签
<from>:定义具体的匹配规则
<to>:匹配成功后的目标地址
<to type="">:type的值有两个,一个是 forward (转发,参数不丢失),一个是 redirect (重定向,地址栏显示的地址就是目标真实地址)
$1:匹配中的第一个正则表达式的字符串的值,$2,$3,$4....也是如此
& :是 & 的实体名,代表的就是 &,这个可以在 w3school 中找到:http://www.w3school.com.cn/tags/html_ref_entities.html
第一个rule:访问 /index.html,实际上是访问了 /index.jsp
第二个rule:访问 /xx.action , 实际上是访问了 view 目录下的 xx.jsp
第三个rule:访问 /user/xx/yy/zz.do , 实际上是访问了 view 目录下的 parameter 目录下的 xx.jsp?username=yy&password=zz
第四个rule:跟第三个其实是一样的,但是由于是重定向模式,所以地址栏就会显示真的是地址
-->
在web.xml中初始化。添加过滤器:
<!--urlrewrite过滤器-->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<!-- 设置自动更新urlrewrite.xml信息 -->
<param-name>confReloadCheckInterval</param-name>
<param-value>60</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
至此,搞定!