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&pageSize=$2&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>元素
<rule>元素
<outbound-rule>元素
<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”)
<from> 元素 rule 或者outbound-rule 必须至有一个from 元素,该值为url 相对于上下文的值
<to>元素 重写后的输出值
<to>null</to>表示当这个规则匹配时,将不会有任何的反应。 to元素可以包含后引用(backreferences)和变量 (1)Backreferences 比如:%N (2)变量 %{varName} 任何变量的 condition type 可以被用来作为varName。比如:%{port}将被翻译为80,%{year}将被翻译成2009等 (3)函数 %{function:params} 函数可以用在set元素或者to元素中。
<set>元素 如果rule 匹配的话,允许你设置一些变量。
<!--把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元素同级别
<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可以查看。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 修改Flash Builder注释里的@author
- c – Qt Creator – calloc因大内存而失败
- ruby-on-rails – 如何部署线程安全的异步Rails应
- 在element-ui的el-tree组件中用render函数生成el
- ruby-on-rails – 在Rails 4应用程序中添加新页面
- ruby-on-rails – 在Ruby on Rails中的simple_fo
- Flash存储器SLC、MLC、TLC到QLC的演变,有什么区
- React 深入系列2:组件分类
- actionscript-3 – Adob??e AIR – .air到.exe /
- c# – 语法问题使用yield return的IEnumerable方