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

简介:



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

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

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


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

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

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

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

UrlRewrite的导入:

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


 
 
  1. <filter> 
  2.         <filter-name>UrlRewriteFilter</filter-name> 
  3.         <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class
  4.     </filter> 
  5.     <filter-mapping> 
  6.         <filter-name>UrlRewriteFilter</filter-name> 
  7.         <url-pattern>/*</url-pattern> 
  8.         <dispatcher>REQUEST</dispatcher> 
  9.         <dispatcher>FORWARD</dispatcher> 
  10.     </filter-mapping> 

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


 
 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE urlrewrite 
  3. PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" 
  4. "http://tuckey.org/res/dtds/urlrewrite3.0.dtd"
  5. <urlrewrite> 
  6.  
  7. </urlrewrite> 

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

至此,UrlRewrite的导入就完成了

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


 
 
  1. <rule> 
  2.          <from>^/demo/(\w+).html$</from> 
  3.          <to type="redirect">/Struts/$1</to> 
  4. </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. <rule> 
  2.          <from>^/demo1/(\w+)/(\w+).html$</from> 
  3.          <to type="redirect" >/Struts/$1.action?age=$2</to> 
  4. </rule> 

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


 
 
  1. <rule match-type="wildcard"
  2.          <from>/demo2/*/*</from> 
  3.          <to type="redirect">/Struts/$1.action?age=$2</to> 
  4. </rule> 

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

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


 
 
  1. <rule> 
  2.          <from>^/demo3/(\w+)/(\w+).html$</from> 
  3.          <run class="com.sean.action.Demo" method="log" /> 
  4.          <to type="redirect" >/Struts/$1.action?age=$2</to> 
  5. </rule> 

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


 
 
  1. public class Demo extends RewriteRule{ 
  2.  
  3.     public void log(HttpServletRequest request,HttpServletResponse response){ 
  4.         System.out.println("haha1"); 
  5.     } 
  6.  
  7.     public void log2(HttpServletRequest request,HttpServletResponse response){ 
  8.         System.out.println("haha2"); 
  9.     } 

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

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


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

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


 
 
  1. <outbound-rule match-type="regex"
  2.          <from>/(\w+).action\?id=(\w+)$</from> 
  3.          <to>/$1.html</to> 
  4. </outbound-rule> 

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

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

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

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


来源:51CTO

相关文章
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
594 4
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
332 9
|
人工智能 Java 物联网
JAVA网络编程的未来:URL与URLConnection的无限可能,你准备好了吗?
随着技术的发展和互联网的普及,JAVA网络编程迎来新的机遇。本文通过案例分析,探讨URL与URLConnection在智能API调用和实时数据流处理中的关键作用,展望其未来趋势和潜力。
236 7
|
Java
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
252 1
|
XML JSON 搜索推荐
【高手过招】JAVA网络编程对决:URL与URLConnection的高级玩法,你敢挑战吗?
【高手过招】JAVA网络编程对决:URL与URLConnection的高级玩法,你敢挑战吗?
361 0
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
343 11
|
JSON 安全 算法
JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
336 9
|
Java
Java通过HttpClient从外部url下载文件到本地
该Java程序旨在通过URL将外部网络文件(如图片)下载至本地,并解决防盗链问题。首先,它通过`HttpGet`请求获取远程文件,并通过设置`Referer`头防止防盗链。然后,根据响应内容类型确定文件后缀并保存至指定路径。测试表明,程序能够成功下载文件。
1696 8
Java通过HttpClient从外部url下载文件到本地
|
JSON Java API
JAVA网络编程新纪元:URL与URLConnection的神级运用,你真的会了吗?
本文深入探讨了Java网络编程中URL和URLConnection的高级应用,通过示例代码展示了如何解析URL、发送GET请求并读取响应内容。文章挑战了传统认知,帮助读者更好地理解和运用这两个基础组件,提升网络编程能力。
309 5
|
存储 网络协议 前端开发
在 Java 中如何完全验证 URL
在 Java 中如何完全验证 URL
401 8