Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1001|回复: 0

java URLRewrite的配置和使用

[复制链接]

该用户从未签到

发表于 2011-7-25 08:42:02 | 显示全部楼层 |阅读模式
简介
    UrlRewriteFilter is a Java Web Filter for any J2EE compliant web application server (such as Resin, Orion or Tomcat), which allows you to rewrite URLs before they get to your code. It is a very powerful tool just like Apache's mod_rewrite.
    urlRewriteFilter是一个用于改写URL的Web过滤器,类似于Apache的mod_rewrite。适用于任何Web应用服务器(如Resin,Orion,Tomcat等)。其典型应用就把动态URL静态化,便于搜索引擎爬虫抓取你的动态网页。
使用
    urlRewriter是利用过滤器实现URL转换的,具体使用方法如下:
1. 首先要在网上下载 urlRewriter.jar(建议最新版本 官网下载地址:tuckey.org/urlrewrite/) 。
2. 配置web.xml,其实就是配置一个Filter。
<filter>
   <filter-name>UrlRewriteFilter</filter-name>
   <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <init-param> (这个可以不写,是配置UrlRewriter日志的配置,级别定成WARN)
            <param-name>logLevel</param-name>
            <param-value>WARN</param-value>
     </init-param>
</filter>
<filter-mapping>      
   <filter-name>UrlRewriteFilter</filter-name>        
   <url-pattern>/*</url-pattern>      
   <! - - 下两项可以不写 - ->      
   <dispatcher>REQUEST</dispatcher>      
  <dispatcher>FORWARD</dispatcher>   
</filter-mapping>  
3、在WEB-INF 目录下新建一个urlrewrite.xml(名称一定要正确)文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.1//EN" "urlrewrite3.1.dtd">
<!--  Configuration file for UrlRewriteFilter http://tuckey.org/urlrewrite/ -->
<urlrewrite use-query-string="true">
    <rule>
        <note>robots</note>
        <from>
            ^/robots.txt$
        </from>
        <to type="permanent-redirect">%{context-path}/static/robots.txt</to>
    </rule>
    <rule match-type="regex"> (这里有两个选项 regex 和 wildcard,即正则匹配和通配符匹配)
        <note>the content.do url redirect 阅读无章节</note>
        <from>^/content.do\?nid=([_0-9a-zA-Z]+)$</from>
        <to type="permanent-redirect">%{context-path}/content/$1</to>
    </rule>
</urlrewrite>
红体字一会再做解释。这两条主要是把网站的Robots和小Logo做重写向,红体是表示 301永久重定向。
例如
倾国小说网(www.qgreading.com)的robots.txt 应用上面的配置 www.qgreading.com/robots.txt ---> www.qgreading.com/static/robots.txt
另外,我们也可以充分利用condition这个属性来区分浏览器或者终端进行条件跳转,最简单的,如果一个站即有WEB,也有WAP,我们可以利用User-Agent进行筛选,跳到不同的页面,或者设置不同的属性。一些WAP在区分手机型号时也很有用。
<rule>
<condition name=”user-agent”>Mozilla/3\.0 (compatible; AvantGo .*)</condition>
<from>.*</from>
<set name=”client”>AvantGo</set>
</rule>
<rule>
<condition name=”user-agent”>UP\.Browser/3.*SC03 .*</condition>
<from>.*</from>
<set name=”client”>Samsung SCH-6100</set>
</rule>
配置
只需要增加Rule规则
<rule>
    <note>这里添加描述信息</note>
    <from>这里写需要转变的URL,一般用正则匹配</from>
   <to type="跳转的类型">转换后的URL路径</to>
</rule>
贴一下跳转的类型,一般不好找的哦,呵呵 ……^_^

forward:默认. 请求匹配这个<rule />的所有<condition />, 并且URL使用内部跳转到”to”指定的地址(注意, 这里forward 到的URL 必须和UrlRewriteFilter 位于同一个容器中)。状态码 302。临时重定向。

redirect:用Response.Redirect实现,请求匹配所有<condition />和这个<rule />的<from />, 通知客户端跳转到<to />指定地址,状态码应该是302。

permanent-redirect: 永久重定向。状态码301。相当于做了以下事情
      response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);.
      response.setHeader(“Location”, [<to />指定的值]);

passthrough: 和forward 相同,具体区别我也不清楚。

temporary-redirect:临时重定向。状态码302。 相当于做了以下事情
      response.setStatus(HttpServletResponse. SC_MOVED_TEMPORARILY);
      response.setHeader(“Location”, [<to />指定的值]);

再补充一些配置时候的问题和小技巧:
1. 在配置中如果要使用”&”, 用&
2. 简单起见, 给<from />的配置前面和后面分别加上^, $, 这两个是正则表达式中的强制开始和结尾标志;
3. 如果使用<outbound-rule>要记得代码中的url都是编码过的;
4. contex 是非常重要的, 如果有一个应用的context 是”/myapp”, 并且你的请求是”/myapp/somefolder/somepage.jsp”, 容器交给UrlRewriteFilter 的url 会是”/somefolder/somepage.jsp”, 这可能难以理解, 但是在你的<rule>和<condition>中不要包含context path, 它是容器负责处理的.
5. 正则表达式非常复杂灵活, 请阅读java.util.regex.Pattern中的java正则介绍。如果觉得正则难以理解, 可以使用通配符方式。
6. 应用通配符,通配符匹配引擎可以替代正则表达式, 在<condition>和<rule>中设置match-type 是wildcard 用以开启支持通配符.(或者设置default-match-type)
例如:
/big/url/*匹配/big/url/abc.HTML但是不匹配/big/url/abc/dir/或/big/url/abc/
/big/url/**匹配/big/url/abc.html, /big/url/abc/dir/和/big/url/abc/
也可以和正则的替换一样, 每个*代表一个参数, 在<set>和<to>中用$N的方式使用
7. <to />可以是null, 意义为: 如果匹配请求不再继续, 相当于没有调用chain.doFilter
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-4-19 03:26 , Processed in 0.427550 second(s), 52 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表