澳门新葡萄京娱乐场 2

Java UrlRewrite 实现网站URL重写过程实录

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

** UrlRewrite:**

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

UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址,类似于Apache的mod_rewrite。将我们的动态网页地址转化为静态的地址,如html、shtml,还可以隐藏网页的真正路径,
比如:有时候需要将xxx.com/news/ type1/001.jsp
转化成显示路径为xxx.com/news_type1_001.html

/demoAction?id=1            ==>            /demo1.html

有点如下:

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

一:提高安全性,屏蔽内部的url结构.
二:美化URL
三:更有利于搜索引擎的收入,通过对URL的一些优化,可以使搜索引擎更好的识别与收录网站的信息.

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

官网下载址:
http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#filterparams

以下是UrlRewrite的使用实例(个人认为,UrlRewrite的官方文档写的还是比较全面易懂的)

实例
使用版本urlrewritefilter-4.0.3. Tomcat服务器端口定制为80

UrlRewrite的导入:

  1. 创建web项目,增加 urlrewritefilter-4.0.3.jar 到 WEB-INF/lib
  2. 在WEB-INF/web.xml 增加urlrewritefilter过滤器

UrlRewrite的导入非常简单,首先需在项目的lib文件夹中加入urlrewrite-3.2.0.jar包,然后,在web.xml中声明Filter

<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>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   <!-- 加到任何servlet映射的顶部,不然可能有些路径不能被过滤到 http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/3.2/index.html -->
   <filter>
      <filter-name>UrlRewriteFilter</filter-name>
      <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
      <!-- 设备文件重加载间隔 (0默示随时加载, -1默示不重加载, 默认-1) -->
      <init-param>
         <param-name>confReloadCheckInterval</param-name>
         <param-value>60</param-value>
      </init-param>
      <!-- 自定义配置文件的路径,是相对context的路径,(默认位置 /WEB-INF/urlrewrite.xml) -->
      <init-param>
         <param-name>confPath</param-name>
         <param-value>/WEB-INF/urlrewrite.xml</param-value>
      </init-param>
      <!-- 设置日志级别(将被记录到日志中) 可以为: TRACE, DEBUG, INFO (default), WARN, ERROR, FATAL, log4j, commons, slf4j, 比如 sysout:DEBUG(设置到控制台调试输出级别) (默认级别 WARN) -->
      <init-param>
         <param-name>logLevel</param-name>
         <param-value>DEBUG</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>UrlRewriteFilter</filter-name>
      <url-pattern>/*</url-pattern>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>FORWARD</dispatcher>
   </filter-mapping>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
</web-app>

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

如果觉得/这样的通配,并不符合我的预期,我只想对部分路径进行URL的重写,/可能会造成我想象不到的或者是许微不足道的性能浪费.我把它改成了我需要的:

<?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>
  <filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name>  
    <url-pattern>/member/*</url-pattern> 
  </filter-mapping>  
  <filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name>  
    <url-pattern>/article/*</url-pattern> 
  </filter-mapping>

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

因为上面我们通过confPath定义了配置文件的路径,其实该默认位置就是在/WEB-INF/urlrewrite.xml,为了更能说明问题,所以显示指定下

至此,UrlRewrite的导入就完成了

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN" "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<urlrewrite> 
  <rule> 
    <from>/page/(.*).html</from>  
    <to>/index.jsp?page=$1</to> 
  </rule>  
  <rule> 
    <from>^/user/([a-z]+)/([0-9]+)$</from>  
    <to>/index.jsp?nickname=$1&age=$2<to/>   
  </rule> 
</urlrewrite>

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

此时我们就可以通过url进行模拟了.
注意:

<rule>
         <from>^/demo/(w+).html$</from>
         <to type="redirect">/Struts/$1</to>
</rule>
  1. urlrewrite.xml是utf-8.所以如果你要在rule上加note标签为中文的话,也一定是要utf-8.
  2. UrlRewriteFilter
    最好是配置在web.xml的前面filter上,不然有可能对有些url转变失去作用.
  3. urlrewrite属性:有仅只有一个,rule属性::至少一个.
  4. 在写rule的时,如果有多个参数时,中间的连接符号&应该是&
  5. rule是url重写规则,from是显示出来的地址,to是映射的实际地址,$1是重写参数,它的值与from中的正则表达式是一一对应,可以为多个,()里是匹配的正则表达式,
    在正则表达式^指定字符的串开始,$为指定结束
  6. 对于中文参数要使用(.*)作为参数转义.

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

重写url演示

如上规则设置,当客户端访问的网址是  的时候,因为匹配部分是hello,所以它跳转到的是 上。当网址规则中有多个正则的时候,匹配的参数也会随之增加。如:

<rule> 
  <from>/page/(.*).html</from>
   <to>/index.jsp?currentPage=$1</to>
</rule>
<rule>
         <from>^/demo1/(w+)/(w+).html$</from>
         <to type="redirect" >/Struts/$1.action?age=$2</to>
</rule>

index.jsp中的内容

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

<body>
  <% String current = request.getParameter("currentPage"); %> 当前页码<%=current %> 
</body>
<rule match-type="wildcard">
         <from>/demo2/*/*</from>
         <to type="redirect">/Struts/$1.action?age=$2</to>
</rule>

执行效果如下:

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

澳门新葡萄京娱乐场 1

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

实例2
Rule规则

<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>
<rule>
 <name>World Rule</name>
 <from>^/user/([a-z]+)/([0-9]+)$</from>
 <to>/index.jsp?nickname=$1&age=$2</to>
</rule>

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

index.jsp中的内容

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");
    }
}
<body>
 <% String username = request.getParameter("nickname"); int age = Integer.parseInt(request.getParameter("age")); %> 用户名: 
 <%=username %> 年龄: <%=age %> <br>
</body>

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

执行效果如下:

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

澳门新葡萄京娱乐场 2

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

所以,当我们在url中输入
http://localhost/urlrewrite/user/dennisit/23
实际执行的就是
http://localhost/urlrewrite/index.jsp?nickname=dennisit&age=23

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

实例3
同理rule规则如下时

<outbound-rule match-type="regex">
         <from>/(w+).action?id=(w+)$</from>
         <to>/$1.html</to>
</outbound-rule>
<rule>
 <from>^/page/(.*)$</from>
 <to type="redirect">/page/$1.action</to>
</rule>

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

这样我访问的:http://localhost/urlrewrite/page/test
则跳转到: http://localhost/urlrewrite/page/test.action

可是在页面中显示却成了如下:

实例4Rule规则

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

<rule>
<from>^/([a-z]+)/([a-z]+)/([a-z]+)$</from>
<to>/$1.do?method=$2&uuid=$3</to>
</rule>

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

在index.jsp中添加如下链接:
<a href="process/show/index">跳转</a>

UrlRewrite的帮助文档:

当点击该链接,
地址栏中显示url是:http://localhost/urlrewrite/process/show/index
其实际执行路径是:http://localhost/urlrewrite/process.do?method=show&uuid=index

发表评论

电子邮件地址不会被公开。 必填项已用*标注