UrlRewrite 关于地址重写来增加安全性

简介

UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址。

为了访问方便,防止用户在url后乱加参数等安全原因,有时候需要对网站的访问路径进行伪装,如把

   http://localhost:8080/datasystem/portal/toIndex.do    伪装成     http://localhost:8080/datasystem/index.html

优点

(1)提高安全性 
     可以有效的避免一些参数名、ID等完全暴露在用户面前,如果用户随便乱输的话,不符合规则的话直接会返回个404或错误页面,这比直接返回500或一大堆服务器错误信息要好的多。 
(2)美化URL 
     去除了那些比如*.do之类的后缀名、长长的参数串等,可以自己组织精简更能反映访问模块内容的URL 
(3)利于搜索引擎的收入 
     通过对URL的一些优化,可以使搜索引擎更好的识别与收录网站的信息

使用步骤

    1、下载jar

     普通web项目

           官方地址:http://tuckey.org/urlrewrite/ 

           下载链接:http://central.maven.org/maven2/org/tuckey/urlrewritefilter/4.0.3/urlrewritefilter-4.0.3.jar
           下载urlrewritefilter-4.0.3.jar,加入到工程lib目录下。

    maven项目  添加下面这段代码到你的pom.xml中就行

<dependency>  
   <groupId>org.tuckey</groupId>
   <artifactId>urlrewritefilter</artifactId>
   <version>4.0.3</version>
</dependency>

   2、配置web.xml

<!--配置Url Rewrite的Filter --> 
  <filter> 
     <filter-name>UrlRewriteFilter</filter-name> 
     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
  </filter> 
  <!--配置Url Rewrite的Filter拦截所有请求--> 
  <filter-mapping> 
     <filter-name>UrlRewriteFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
  </filter-mapping>

 3、配置urlrewrite.xml    (添加urlrewrite.xml 到工程的WEB-INF目录下。   

<?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>中的地址表示我们浏览器要访问的地址 -->
        <from> /index.html </from> 

        <!-- <to>中的内容表示浏览器访问了上述地址后,实际转向能真正访问系统的地址 -->
        <to type="forward"> /portal/toIndex.do</to>
        
        <!--  <to type="redirect"> %{context-path}/portal/toIndex.do</to> -->
    </rule> 
</urlrewrite>

   forward和redirect都可以用,但forward访问完后还是不会显示真实访问地址,个人感觉好一些

  

  示例:

     1、使用正则表达式匹配(rule 的默认匹配方式是正则表达式)

<rule>
       <from>^/demo/(\w+).html$</from>//客户端访问的地址:http://127.0.0.1:8080/Struts/demo/hello.html
       <to type="forward">/Struts/$1</to>//实际访问的地址:http://127.0.0.1:8080/Struts/hello
</rule>

解析:

   rule  是urlrewrite下的子节点,是urlrewrite的主要规则节点,在它里面包含from 和to两个子节点,from表示请求的URL,to表示将转到的真实的URL。

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

  <rule>标签中的配置:

  <from>中的地址表示我们浏览器要访问的地址(即敲回车前在地址栏输入的地址,或者<a>标签指向的连接),可以自己指定。

      <from>中的地址内,括号里的内容为正则表达式,用来过滤字符,比如 ^/news/([0-9]+).html$ 表示可以匹配/news目录下以任意位数字命名的.html文件,如news/1.html、news/1234.html等。主要用于过滤访问路径或传参。

        <to>中的type如果不写,则默认为forward。

  <to>中的内容表示浏览器访问了上述地址后,实际转向能真正访问系统的地址,这个地址需要是真是存在的(当然SpringMVC可以设置为Controller的地址,struts2可以设置为action的地址等),上面例子<to>标签指向的地址中的“$1”表示<from>标签中的第一处正则表达式所匹配的实际内容(即 ([0 - 9]+)  ),利用这一特性,可以达到传参的效果。

<rule>
     <from>^/demo1/(\w+)/(\w+).html$</from>
     <to type="forward" >/Struts/$1.action?age=$2</to>
</rule>

     <rule>标签所起到的作用就是:浏览器访问的是<from>中的地址,它把这个地址经过过滤转向访问<to>中地址,返回时再以静态地址的方式显示。

    但一般情况下,这些静态地址都不是我们手动输入到地址栏的,而是存在于网页中,由用户点击访问的,而且很多情况下<a>标签中的地址都会用动态地址如.jsp、.php等,这种情况下,就需要使用<outbound-rule>了。

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



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

 你会发现<outbound-rule>的配置,其中的<from>和<to>标签中的内容差不多与上面的<rule>标签刚好相反。

  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="${pageContext.request.contextPath}/news/news.html?newsId=${news}">新闻1</a>
            </li>
            <li>
                <a href="${pageContext.request.contextPath}/news/news.html?newsId=${news}">新闻2</a>
            </li>
            <li>
                <a href="${pageContext.request.contextPath}/news/news.html?newsId=${news}">新闻3</a>
           </li>
        </ul>
    </ul>
</body>
</html>

     上面对”新闻1”链接的配置就是如此,jsp通过获取news的值,给用户展现的就是一个静态地址了,相当于比直接访问静态页面多走了两步,urlrewrite.xml中具体执行顺序如下

  

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

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

如果有遇到不懂或者有问题时,可以加我QQ:1035644768(标注 博客),希望能够跟大家交流学习!

该博客转载自:

      作者:Benett-Chen

      链接:https://blog.csdn.net/sky_100/article/details/53410013

     

猜你喜欢

转载自blog.csdn.net/qq_39135287/article/details/82053808