urlrewriter转载

如今大部分的网站和商城都会使用到URL重写,接触到这个,也是由于正在作的电子商务商城。URL重写,是将原有的URL采用另外一种规则来显示,使得用户方便访问同时也屏蔽一些信息。html

  在此说下它的好处,在开发过程当中,常常会遇到一些带了一大堆参数的URL,这样子,一方面显得烦乱,另外一方面,一些信息直接显示在URL上,会有些安全性问题。使用URL重写,可使带有参数的URL以一种较规则的方式体现,如:web

  /demoAction?id=1            ==>            /demo1.html正则表达式

  它也将本该在URL上显示出来的传参给隐蔽起来,隐藏了技术实现和敏感信息。另外,URL重写,也有利于搜索引擎的访问。安全

  最近项目接触到的URL重写采用的是UrlRewrite,它主要是采用Filter技术在用户请求的时候对访问的URL进行处理,来实现重写的做用。app

  如下是UrlRewrite的使用实例(我的认为,UrlRewrite的官方文档写的仍是比较全面易懂的)框架

  UrlRewrite的导入:函数

  UrlRewrite的导入很是简单,首先需在项目的lib文件夹中加入urlrewrite-3.2.0.jar包,而后,在web.xml中声明Filter性能

1网站

2搜索引擎

3

4

5

6

7

8

9

10

<filter>

        <filter-name>UrlRewriteFilter</filter-name>

        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>UrlRewriteFilter</filter-name>

        <url-pattern>/*</url-pattern>

        <dispatcher>REQUEST</dispatcher>

        <dispatcher>FORWARD</dispatcher>

    </filter-mapping>

  声明完filter后,须要在WEB-INF目录下新建一个urlrewrite.xml文件

1

2

3

4

5

6

7

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE urlrewrite

PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"

"http://tuckey.org/res/dtds/urlrewrite3.0.dtd">

<urlrewrite>   

     

</urlrewrite>

  该文件是UrlRewrite的规则制定文件,后续主要经过配置它来进行URL的重写。

  至此,UrlRewrite的导入就完成了

  UrlRewrite 导入成功后,接下来主要经过在urlrewrite.xml添加规则,就能实现URL的重写了。在此列举一些经常使用的规则。

1

2

3

4

<rule>

       <from>^/demo/(\w+).html$</from>

       <to type="redirect">/Struts/$1</to>

</rule>

  rule 是urlrewrite下的子节点,是urlrewrite的主要规则节点,在它里面包含from 和to两个子节点,from表示请求的URL,to表示将转到的真实的URL。关于from,UrlRewrite有两种匹配的模式,一种是正则表达式匹 配,一种的通配符匹配,如上就是正则表达式匹配。当进行匹配的时候,匹配部分的正则能够被提取为参数进行传递

  如上规则设置,当客户端访问的网址是http://127.0.0.1:8080/Struts/demo/hello.html  的时候,由于匹配部分是hello,因此它跳转到的是http://127.0.0.1:8080/Struts/hello 上。当网址规则中有多个正则的时候,匹配的参数也会随之增长。如:

1

2

3

4

<rule>

        <from>^/demo1/(\w+)/(\w+).html$</from>

        <to type="redirect" >/Struts/$1.action?age=$2</to>

</rule>

  rule 的默认匹配方式是正则表达式,可是,有时候也能够以通配符的形式进行匹配。在编写规则的时候,只须要在rule添加一个match-type="wildcard" 的属性便可。

1

2

3

4

<rule match-type="wildcard">

        <from>/demo2/*/*</from>

        <to type="redirect">/Struts/$1.action?age=$2</to>

</rule>

  关于to节点,UrlRewrite提供了多种网址跳转方式,如forward和redirect,这两种方式,和大部分MVC框架提供的功能同样,在此再也不赘述。

  除了支持指定规则的跳转外,UrlRewrite还支持当匹配规则的时候执行某个对象的某个函数

1

2

3

4

5

<rule>

        <from>^/demo3/(\w+)/(\w+).html$</from>

        <run class="com.sean.action.Demo" method="log" />

        <to type="redirect" >/Struts/$1.action?age=$2</to>

</rule>

  如上述设置,要实现匹配规则是执行某个函数,须要添加多一个run节点,在节点上面添加对应的类属性和方法属性。同时,对应的类必须继承 RewriteRule类,执行的方法必须传入两个参数,分别是HttpServletRequest 和HttpServletResponse

1

2

3

4

5

6

7

8

9

10

public class Demo extends RewriteRule{

 

    public void log(HttpServletRequest request,HttpServletResponse response){

        System.out.println("haha1");

    }

     

    public void log2(HttpServletRequest request,HttpServletResponse response){

        System.out.println("haha2");

    }

}

  这样,当客户端输入的网址第一次匹配到指定规则的时候,UrlRewrite就会执行对应的函数,该函数只在第一次匹配成功的时候执行。

  若是想要每次匹配规则都执行某函数,能够在urlrewrite添加class-rule子节点,该节点设置后,每次匹配规则后,指定的函数都会执行一次。

1

<class-rule class="com.sean.action.Demo" method="log2"/>

  除了对请求的URL进行处理外,UrlRewrite还提供了对返回页面中的地址进行重写的功能。使用rule是对用户输入的url进行处理,可是开发过程当中,常常须要在页面中也添加一些网址请求,UrlRewrite能够经过规则,对页面中的网址也进行重写。如:

1

2

3

4

<outbound-rule match-type="regex">

        <from>/(\w+).action\?id=(\w+)$</from>

        <to>/$1.html</to>

</outbound-rule>

  在UrlRewrite中添加该规则后,咱们在页面中本来的地址是

  但是在页面中显示却成了以下:

  这样能够隐藏了许多开发中的技术,较为安全。

  以上,就是UrlRewrite的一些常见的用法。关于UrlRewrite,网上也有人说这个会影响性能,由于在每次请求的时候都须要通过换一次过滤,可是这个仍是要见仁见智,毕竟,使用URL重写,对网址仍是有好处的。

  UrlRewrite的帮助文档:http://pan.baidu.com/s/1c0fg0uc

相关文章
相关标签/搜索