UrlReWriteFilter路径改写(伪链接)

前端之家收集整理的这篇文章主要介绍了UrlReWriteFilter路径改写(伪链接)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概念:

UrlRewriteFilter是一个用于改写URL的Web过滤器,类似于Apache的mod_rewrite。适用于任何Web应用服务器(如Resin,Orion,Tomcat等)。其典型应用就把动态URL静态化,便于搜索引擎爬虫抓取你的动态网页。

在网站开发中使用到是必须的

使用步骤:

1、添加urlrewrite-3.2.0.jar到工程中。

2、在web.xml中添加过滤器,如下:

    <filter>  
        <filter-name>UrlRewriteFilter</filter-name>  
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>  
        <init-param>  
            <param-name>logLevel</param-name>  
            <param-value>WARN</param-value>  
        </init-param>  
    </filter>  
      
    <filter-mapping>  
        <filter-name>UrlRewriteFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping> 

3、在struts2的过滤器中添加<dispatcher>REQUEST</dispatcher>和<dispatcher>FORWARD</dispatcher>,如下:

   <filter>  
        <filter-name>struts2</filter-name>  
        <filter-class>  
            org.apache.struts2.dispatcher.FilterDispatcher  
        </filter-class>  
   </filter>  
   <filter-mapping>  
        <filter-name>struts2</filter-name>  
        <url-pattern>*.action</url-pattern>  
        <dispatcher>REQUEST</dispatcher>  
        <dispatcher>FORWARD</dispatcher>  
   </filter-mapping> 

4、编写urlrewrite.xml文件。将文件放在WEB-INF文件夹下。(注意文件名一定要是urlrewrite.xml)文件内容如下:

第一个rule标签中访问静态页面的地址是/html/0/0/97.html,实际访问的是/system/goColumnList.do?columnId=97&pageSize=0&flag=0

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
    "http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
   <rule>
    <from>/html/([0-9]+)/([0-9]+)/([0-9]+).html</from> 
    <to type="forward">/system/goColumnList.do?columnId=$3&amp;pageSize=$2&amp;flag=$1</to>
  </rule>
  <rule>
    <from>/html/events/showevents/([0-9]+).html</from> 
    <to type="forward">/events/showevents.do?columnid=$1</to>
  </rule>
  <rule>
    <from>/index.html</from> 
    <to type="redirect">/</to>
  </rule>
</urlrewrite>

<from>标签中的路径的格式就是我们要改写的的样式。(目标样式

<to>标签中的实际是我们真实的请求。

即:就是通过这个配置文件,将我们请求的美化后的伪静态html页面,映射成为真实的action请求

需要注意一下几点:

1、<to>有两种type,分别为:forward和redirect。

如果使用forward,则限定<to>中的请求必须和urlRewriteFilter在同一上下文环境中。而redirect则没有限制,可以跳转到任何其他的工程中。

2、<from>标签中使用的是正则表达式,即^和$之间的内容

3、from可以包含多个正则表达式,其对应的参数,在<to>中,可以用$1,$2等按照顺序进行接收。

4、在struts2的过滤器中:

如果没有配置<dispatcher>REQUEST</dispatcher>,redirect方式是不可用的。

如果没有添加<dispatcher>FORWARD</dispatcher>,forward方式是不可用的。

<dispatcher>INCLUDE </dispatcher> 不是必须的

5、使用redirect方式,相比forward方式,性能较低。所以如果系统到处都要使用URL美化器,要慎重选择使用redirect。

6、如果使用forward方式,则要处理好路径方面的问题。因为如果经过美化,URL的路径中多了或者少了几个目录,其跳转后的页面中,使用相对路径的资源(例如图片),就会请求不到,原因就是路径是以当前的URL路径为基础进行计算位置的。

7、解决方法

a,在跳转的jsp页面中,资源的路径位置使用绝对路径

b,不要在不同目录之间使用forward做请求转发,保证当前路径不发生变化。

c,改用redirect方式。

8、web.xml 下的filter 参数设置介绍

<!-- 
设置定时检查配置文件的时间以供重新加载的时间,该参数值为整型,0为每次都检查,-1为从不检查,默认为-1  
 -->  
        <init-param>  
            <param-name>confReloadCheckInterval</param-name>  
            <param-value>60</param-value>  
        </init-param>  
 <!--  (default /WEB-INF/urlrewrite.xml)   设置配置文件的路径  -->  
        <init-param>  
            <param-name>confPath</param-name>  
            <param-value>/WEB-INF/urlrewrite.xml</param-value>  
        </init-param> 
<!-- sets up log level (will be logged to context log)  
        can be: TRACE,DEBUG,INFO (default),WARN,ERROR,FATAL,log4j,commons,slf4j,sysout:{level} (ie,sysout:DEBUG)  
        if you are having trouble using normal levels use sysout:DEBUG  
        (default WARN)  
设置日志的等级  
 -->  
        <init-param>  
            <param-name>logLevel</param-name>  
            <param-value>DEBUG</param-value>  
        </init-param>  
  
        <!-- you can change status path so that it does not  
        conflict with your installed apps (note,defaults  
        to /rewrite-status) note,must start with /   
设置状态目录,必须以/开始,默认为/rewrite-status  
-->  
        <init-param>  
            <param-name>statusPath</param-name>  
            <param-value>/status</param-value>  
        </init-param>  
  
        <!-- you can disable status page if desired  
        can be: true,false (default true)   
是否允许状态页面,默认为true  
-->  
        <init-param>  
            <param-name>statusEnabled</param-name>  
            <param-value>true</param-value>  
        </init-param> 
 <!-- you may want to allow more hosts to look at the status page  
        statusEnabledOnHosts is a comma delimited list of hosts,* can  
        be used as a wildcard (defaults to "localhost,local,127.0.0.1")   
设置host 的列表,可以使用通配符,多个host 用逗号隔开  
-->  
        <init-param>  
            <param-name>statusEnabledOnHosts</param-name>  
            <param-value>localhost,dev.*.myco.com,*.uat.mycom.com</param-value>  
        </init-param>  
  
  

9、必须掌握的小知识点

(1)xml 的一些字符必须要进行转义,如& 要转成 $amp;

(2)正则表达式里 在from 元素中,是以 ^ 开始 $结束的。

10、元素参数说明

<urlrewrite>元素

@H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@
参数 取值 描述
default-match-type regex(默认)、wildcard 所有的rule和condition 元素都会用到该匹配方法
decode-using header,utf8(默认)、null、iso-8859-1 等 当url 需要解码时request.getCharacterEncoding()将被用到,如果为空,则为utf-8
use-query-string false(默认)、true 语句是否加到url的后面
use-context false(默认)、true 上下午路径是否要加到url 中







<rule>元素

@H_404_620@ @H_404_620@ @H_404_620@
参数 取值 描述
enable true(默认)、false 是否应用该rule
match-type regex(默认)、wildcard 应用那种匹配规则


<outbound-rule>元素

@H_404_620@ @H_404_620@ @H_404_620@
参数 取值 描述
enabled true(默认)、false 是否应该该规则
encodefirst false(默认)、false 是否在执行<outbound-rule>之前执行encodeURL(),ture为之后,false为之前

<name>元素

<!--该规则的名称,可以用在rule元素和outbound-rule 元素中-->  

<note>元素

<!--用来描述该规则,可用在rule 元素和outbound-rule元素中-->  
   <rule>  
       <name>World Rule</name>  
       <note>  
           Cleanly redirect world requests to JSP,a country and city must be specified.  
       </note>  
       <from>^/world/([a-z]+)/([a-z]+)$</from>  
       <to>/world.jsp</to>  
   </rule> 


<condition>元素

可以用来为rule元素选择条件,所有条件将在规则执行时执行(除非显式的把“next” 设为“or”)

@H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@
参数 取值 描述
type header(默认)、method、port、time等 设置一些条件的类型
name 可为任何值 如果type 取值为header,这个名称将是http header 的值
next and(默认)、or and:下一个rule 元素和这个rule 必须匹配。or:下一个rule元素或者这个condition 将被匹配
operator equal(默认)、notequal、greater、less等 ie请求的值和condition 值比较

<from> 元素

rule 或者outbound-rule 必须至有一个from 元素,该值为url 相对于上下文的值

@H_404_620@ @H_404_620@
参数 取值 描述
casesensitive false(默认)、true 是否要求该值的大小写,false为大小写匹配,true为忽略大小写

<to>元素

重写后的输出

@H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@
参数 取值 描述
type forward(默认)、passthrough、redirect等 url 的跳转问题
last false(默认)、true

false:余下的rule 元素将被执行,如果该规则符合的话

true:剩下的rule 元素不被执行,如果该规则符合的话

encode false(默认)、true

response.encodeURL([to]) 是否被调用

false:将在url重写前调用

true:将不被调用

context

如果应用服务器配置允许 cross context(跨越上下文),这个属性将被forward(只有forward可以,redirct 或者其他to元素的类型都不可以)

比如在tomcat 的配置文件中设有:

<Context docBase="app" path="/app" reloadable="true" crossContext="true"/>
<Context docBase="forum" path="/forum" reloadable="true" crossContext="true"/>



<to>null</to>表示当这个规则匹配时,将不会有任何的反应。

to元素可以包含后引用(backreferences)和变量

(1)Backreferences

比如:%N

(2)变量

%{varName}

任何变量的 condition type 可以被用来作为varName。比如:%{port}将被翻译为80,%{year}将被翻译成2009等

(3)函数

%{function:params}

函数可以用在set元素或者to元素中。

@H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@
名称 实例 输入结果
replace ${replace:my cat is a blue cat:cat:dog} my dog is a blue dog
replaceFirst ${replace:my cat is a blue cat:cat:dog} my cat is a blue dog
escape ${escape:a b c} a+b+c
unescape ${unescape:a+b+c} a b c
lower ${lower:Hello World} hello world
upper ${upper:hello} HELLO
trim ${trim: abc def } abc def

<set>元素

如果rule 匹配的话,允许你设置一些变量。

@H_404_620@ @H_404_620@ @H_404_620@
参数 取值 描述
type request、session、cookie、charset等 设置域的类型
name 任何数

在request、

<!--把client 的值设进request中,可通过request.getAttribute("client")来获取-->  
    <rule>  
        <condition name="user-agent">Mozilla/3/.0 (compatible; AvantGo .*)</from>  
        <from>.*</from>  
        <set name="client">AvantGo</set>  
    </rule>  
    

<run> 元素

当rule和它的condition匹配时,你可以运行对象中的一个方法,可以再rule元素内部,也可以与rule元素同级别

@H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@
参数 取值 描述
class 你所要调用方法的对象
method run(默认) 你所要调用方法,该方法必须带有(HttpServletRequest,HttpServletResponse)参数。例如:run(HttpServletRequest request,HttpServletResponse response)
如果init(ServletConfig)或者destroy() 方法,将会被执行,当创建或销毁该Object时
neweachtime false(默认)、true 该Oject 是否为单例执行。false为单例,true为每次都new 新的Object

   <rule>  
       <from>^/world/[a-z]+/[a-z]+$</from>  
       <run class="com.blah.web.WorldServlet" method="doGet" />  
       <to>/world-presentation.jsp</to>  
   </rule>  
<!--可以设置一些初始值-->  
  <run class="com.blah.web.MyServlet" method="doGet">  
       <init-param>  
           <param-name>someParamName</param-name>  
           <param-value>10</param-value>  
       </init-param>  
   </run>  

<class-rule>元素

每次请求都执行这个方法在rule 元素中,具体的例子在org.tuckey.web.filters.urlrewrite.sample可以查看。

@H_404_620@ @H_404_620@ @H_404_620@ @H_404_620@
参数 取值 描述
class 运行的Object,必须带有包的全名

method

matches(默认) 运行的方法,和run元素中的方法类似
last true(默认) 当为false时更多的rule将被执行,即使寂静匹配

猜你在找的XML相关文章