【项目实战】——Java实现伪静态——urlrewrite

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/50081833

背 景


  记得在大学《网页设计》一课上,写过不少网页,最后结课时,还为我的家庭和大学宿舍各做了一个小型静态网站《MyFamily》和《七匹狼与一头猪》,都是用记事本写的纯html,期间做过不少修修改改,比如嫌这张图片不好看,那篇简介不够生动等等,这些修改都得用记事本打开,修改html代码。这点就暴露出了静态网页的一个弊端:不支持动态内容更新,更新内容需要直接修改代码。

  您肯定发现了,现在许多网站的页面都是“静态网页”(看地址栏):

  普惠理财:

  京东超市:

  so 问题来了,这些网页上的内容肯定是需要持续更新的,它们真的是静态网页吗?答案肯定是否定的,那么这是如何实现的呢?

  这种页面,从地址栏上看似是静态页,但实质都是动态的(jsp、php等),只是通过某种方式把它们“伪装”成静态的页面,是通过伪静态技术来实现的。

  为什么要这么做呢?有什么好处?   Reason1、也是最重要的一点,网络爬虫比较喜欢静态页面,利于搜索引擎的收录。   Reason2、您看到下面这两个地址有什么不同的感受?        地址1:www.superman.danny/contact.html        地址2:www.superman.danny/contact.jsp?id=32&type=0&timestamp=2015112912313445343344

java实现伪静态


  在java中实现伪静态很简单,可以通过第三方包UrlRewriteFilter来实现。

  项目目录结构

  1、下载并引用jar包: urlrewritefilter-4.0.3.jar

  2、配置web.xml

  在web.xml中配置过滤器

<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>

  3、在web.xml同级目录新建urlrewrite.xml,内容为:

<urlrewrite>
    <rule>
        <from>^/news/news.html$</from>
        <to>/news/news.jsp</to>
    </rule>
    <rule>
        <from>^/news/([0-9]+).html$</from>
        <to>/news/news.jsp?newsId=$1</to>
    </rule>
    <outbound-rule>
        <from>^/UrlReWriteDemo/news/news.jsp\?newsId=([0-9]+)$</from>
        <to>/UrlReWriteDemo/news/$1.html</to>
    </outbound-rule>
</urlrewrite>

  4、建两个简单的页面,index.jsp中放几个链接,点击连接后跳转到news.jsp中,并传递参数。

  index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
</head>
<body>
    <ul>
        <li>新闻</li>
        <ul>
            <li><a href="/UrlReWriteDemo/news/news.html">新闻</a></li>
            <li><c:url value="/news/news.jsp?newsId=1" var="tempNewsUrl"></c:url>
                <a href="${tempNewsUrl}">新闻1</a></li>
            <li><c:url value="/news/news.jsp?newsId=2" var="tempNewsUrl"></c:url>
                <a href="${tempNewsUrl}">新闻2</a></li>
            <li><c:url value="/news/news.jsp?newsId=3" var="tempNewsUrl"></c:url>
                <a href="${tempNewsUrl}">新闻3</a></li>
        </ul>
    </ul>
</body>
</html>

  news.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%Object newsId=request.getParameter("newsId"); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>新闻</title>
</head>
<body>
本条新闻id为 :<%="news".equals(newsId.toString())?"空值,因为您访问的是静态页面news.html":newsId %>
</body>
</html>

  到此,一个简单的伪静态的过程就完成了。

  启动运行项目,把鼠标放在“新闻1”上,发现状态栏中的地址是http://localhost:8080/UrlReWriteDemo/news/1.html

  访问后,虽然真是访问的地址是 http://localhost:8080/UrlReWriteDemo/news/news.jsp?newsId=1,但是看到地址栏跳转到的页面地址是 http://localhost:8080/UrlReWriteDemo/news/1.html

画龙点睛(重要)


  上面整个过程中,实现伪静态起关键作用的就是urlrewrite.xml的配置。

  先看<rule>标签中的配置:

<from>中的地址表示我们浏览器要访问的地址(即敲回车前在地址栏输入的地址,或者<a>标签指向的连接),可以自己指定。<from>中的地址内,括号里的内容为正则表达式,用来过滤字符,比如 ^/news/([0-9]+).html$ 表示可以匹配/news目录下以任意位数字命名的.html文件,如news/1.html、news/1234.html等。主要用于过滤访问路径或传参。

<to>中的内容表示浏览器访问了上述地址后,实际转向能真正访问系统的地址,这个地址需要是真是存在的(当然SpringMVC可以设置为Controller的地址,struts2可以设置为action的地址等),上面例子<to>标签指向的地址中的“$1”表示<from>标签中的第一处正则表达式所匹配的实际内容,利用这一特性,可以达到传参的效果。 <rule>标签所起到的作用就是:浏览器访问的是<from>中的地址,它把这个地址经过过滤转向访问<to>中地址,返回时再以静态地址的方式显示。

  但一般情况下,这些静态地址都不是我们手动输入到地址栏的,而是存在于网页中,由用户点击访问的,而且很多情况下<a>标签中的地址都会用动态地址如.jsp、.php等,这种情况下,就需要使用<outbound-rule>了。滑动一下鼠标再上去看一下<outbound-rule>的配置会发现,其中的<from><to>标签中的内容差不多与<rule>标签刚好相反。

  文章上面对”新闻1”链接的配置就是如此,<c:ur>中的地址本来是动态地址,经过与jstl的<c:ur>标签结合使用,给用户展现的就是一个静态地址了,相当于比直接访问静态页面多走了两步,urlrewrite.xml中具体执行顺序如下:

  ${tempNewsUrl}中的链接指向<outbound-rule>标签<from>中的地址,继而通过各种转向,最终执行到真正的动态地址。

  温馨提示:一些特殊字符在<outbound-rule>中需要转义哦!比如“?”需要转义成“\?”,“&”需要转义成“&amp ;”……

  因为刚刚接触的时候,感觉很绕,看完一些文章后还是感觉很模糊,所以在多次实践后,把自己的理解写出来,与大家分享。(本文参考地址——http://www.tuckey.org/urlrewrite/)

  如果您有更好的建议,非常欢迎与我进一步讨论。这里把写博客用到的Demo分享,里面例举了多种情况(如访问真正的静态页、访问被伪装的静态页、传递多个参数等)的用法举例,下载请点击 UrlReWriteDemo


【 转载请注明出处——胡玉洋《Java实现伪静态——urlrewrite》】

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

用150行python代码来做代码审计笔记

通过审计源代码,也就是查看源代码,来发现其中存在的隐患,代码审计需要对被审计的语言有充分的了解,不仅是能读懂源代码,还要了解语言本身的缺陷。很多时候代码审计的突...

12100
来自专栏Linyb极客之路

Redis开发常用规范

虽然Redis支持持久化,但是Redis的数据存储全部都是在内存中的,成本昂贵。建议根据业务只将高频热数据存储到Redis中【QPS大于5000】,对于低频冷数...

18120
来自专栏PHP在线

2018最新PHP学习路线整合

PHP是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。

44550
来自专栏阮一峰的网络日志

处理Apache日志的Bash脚本

去年一年,我写了将近100篇网络日志。 现在这一年结束了,我要统计"访问量排名",看看哪些文章最受欢迎。(隆重预告:本文结尾处将揭晓前5名。) ? 以往,我用的...

37550
来自专栏鸿的学习笔记

Actor模型速览

Actor的核心在于发送消息和接受消息。每一个Actor系统之间的联络都依靠消息的传递,假设现在有两个Actor系统A和B,A会向B发送了一条消息打招呼,或者是...

7930
来自专栏芋道源码1024

从客户端的角度设计后端的接口

2.请求Path,http://www.online.com/api/ [path]

21430
来自专栏云计算

JClouds的命令行界面

我已经使用jclouds一年多了,也一直为它的进步做贡献。目前为止,我已经在很多领域广泛地使用它,特别是在 Fuse Ecosystem 。总之,它是一个特别棒...

26870
来自专栏IT派

Python 新功能:或将允许安全工具查看运行时操作

针对 Python 编程语言的新功能提议之一是希望为运行时添加“透明度”,并让安全和审计工具查看 Python 何时可能运行潜在危险的操作。

10820
来自专栏微信公众号:Java团长

Java后端程序员1年工作经验总结

  毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西。这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统...

31520
来自专栏Fundebug

2020年如何写一个现代的JavaScript库

我写过一些开源项目,在开源方面有一些经验,最近开到了阮老师的微博,深有感触,现在一个开源项目涉及的东西确实挺多的,特别是对于新手来说非常不友好

21850

扫码关注云+社区

领取腾讯云代金券