有些项目需要隐藏请求地址的后缀,比如Struts的请求地址通常写成xxxx.action\xxxx.do结尾,现在想把。action\.do去掉,改为.html或其他(login.action ---> login.html同样可以进行数据请求,实际上还是调用原来的地址

为什么要用URL重写:

主要原因是为了搜索引擎更容易找到,大部分搜索引擎都优先考虑收录静态的HTML页面,而不是动态的*.jsp、*.php页面,但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上的大部分网站都会考虑使用伪静态——就是将*.jsp、*.php这种动态URL伪装成静态的HTML页面。

步骤1:下载Url Rewrite Filter 3.2.0 (官网:http://tuckey.org/urlrewrite/

步骤2:拷贝jar文件

解压urlrewrite-3.2.0-src.rar,(如果是单独的测试工程,则需要拷贝urlrewrite-3.2.0-src/lib下的所有依赖的jar包),拷贝urlrewrite-3.2.0-src\webapp\WEB-INF\lib里的urlrewrite-3.2.0.jar到你的Web工程的WEB-INF\lib目录下

步骤3:配置web.xml 文件

在web.xml文件中添加如下配置代码:

1: <!-- 配置UrlRewrite核心过滤器 -->
2: <filter>
3:     <filter-name>UrlRewriteFilter</filter-name>
4:     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
5: </filter>
6: <filter-mapping>
7:     <filter-name>UrlRewriteFilter</filter-name>
8:     <url-pattern>/*</url-pattern>
9:     <dispatcher>REQUEST</dispatcher>
10:     <dispatcher>FORWARD</dispatcher>
11: </filter-mapping>



12:



这段配置代码可以在urlrewrite的文档中找到:urlrewrite-3.2.0-src\manual\index.html

步骤4:编写urlrewrite.xml配置文件

拷贝urlrewrite-3.2.0-src\webapp\WEB-INF\urlrewrite.xml

标签说明:

<rule>:URL重写规则

<form>: 拦截请求的URL (写正则表达式)

<to> : 真实的URL

示例:

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: <!-- rule: URL重写规则 -->
13: <rule>
14:     <!-- from: 拦截请求的URL (写正则表达式)



15: http://localhost:8080/hrm/



16: -->



17:     <from>^/$</from>
18:     <!-- to: 真实的URL -->
19:     <to type="forward">/main.action</to>
20: </rule>



21:



22: <rule>
23:     <!-- FrameSet请求的地址/left.html、/top.html -->
24:     <from>^/(\w+)\.html$</from>
25:     <to>/$1.action</to>
26: </rule>



27:



28: <!-- 模块级别的URL重写规则 -->
29: <rule>
30:     <!-- /document/selectDocument.html -->
31:     <from>^/(\w+)/(\w+)\.html$</from>
32:     <!-- /document/selectDocument.action -->
33:     <to>/$1/$2.action</to>
34: </rule>



35:



36: <!-- 分页的URL重写规则 -->
37: <rule>
38:     <!--/notice/selectNotice/2.html -->
39:     <from>^/(\w+)/(\w+)/([0-9]+)\.html$</from>
40:     <!--/notice/selectNotice.action?pageModel.pageIndex=2 -->
41:     <to>/$1/$2.action?pageModel.pageIndex=$3</to>
42: </rule>
43: </urlrewrite>



44:



45:



上面分别演示了几种请求地址的重写方式,<to>中隐射真实的地址,其中“$1”"$2”等对应<form>里面正则表达式段

如果你的工程里还用了其他框架进行了请求的拦截,比如Struts2,则要在<filter-mapping>里配置

<dispatcher>REQUEST</dispatcher>

<dispatcher>FORWORD</dispatcher>

1: <!-- 配置Struts2核心过滤器 -->
2: <filter>
3:     <filter-name>struts</filter-name>
4:     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
5: </filter>
6: <filter-mapping>
7:     <filter-name>struts</filter-name>
8:     <url-pattern>*.action</url-pattern>
9:     <dispatcher>REQUEST</dispatcher>
10:     <dispatcher>FORWARD</dispatcher>
11: </filter-mapping>



12:



步骤5:改写原来的求情地址,改为.html结尾(随便上面结尾都行,你喜欢的话.jaxp .asp都可以)

再把原来jsp页面里的xxx.action改为xxxx.html,示例

1: <frameset rows="80,*" cols="*" frameborder="no" border="0" framespacing="0">
2:   <frame src="${pageContext.request.contextPath}/top.html" name="title" scrolling="no" noresize="noresize">
3:   <frameset cols="220,*" frameborder="no" border="0" framespacing="0">
4:     <frame src="${pageContext.request.contextPath}/left.html" name="tree" scrolling="no" marginheight="0" marginwidth="0">
5:     <frame src="${pageContext.request.contextPath}/right.html" name="main" scrolling="yes" frameborder="0" marginwidth="0" marginheight="0" noresize="noresize">
6:   </frameset>
7: </frameset>

上面把/top.action改成了/top.html,这里采用的是FORWORD跳转,地址栏看不到请求后的地址,即原来是这样的http://localhost:8080/hrm(项目名称)/会到主页面main.actin,在经过URL重写后转发,就看不到跳转后的请求main.action了,直接就是http://localhsot:8080/hrm/

在请求/left.html