urlrewrite(伪静态技术运用2之outbound-rule)

问题:页面通过"/servlet/detail?magid=520&categoryId=205“来访问一个servlet,这个链接在IE地址栏上给人家看起来很不舒服,想把它伪装一下变成别的地址,例如想把它伪装成:/servlet/detail/520_205.html 或者其他的url地址那该怎么实现了?

【注意:页面连接不是“/servlet/detail/520_205.html “而是“/servlet/detail?magid=520&categoryId=205”】

urlrewrite.xml配置:

错误代码:

<urlrewrite>

 <rule>
    <from>/servlet/detail/([0-9]+)_([0-9]+).html</from>
     <to>/servlet/detail?magid=$1&amp;categoryId=$2</to>
 </rule>

</urlrewrite> 

有很多新手刚开始就认为这样配置就能解决了上面提问的问题。其实错误,这样页面只能通过:”/servelt/detail/24_42.html ” 来访问,访问这个地址时它会forward到/servlet/detail?magid=24&categoryid=42这个servlet。如果我们页面通过“/servlet/detail?magid=24&categoryid=42”这样来访问的话,是不会被重写的。这是新手的常遇到的一个问题。

正确代码:

<urlrewrite>

 <rule>
  <from>/servelt/detail/([0-9]+)_([0-9]+).html</from>
  <to>/servelt/detail?magid=$1&amp;categoryId=$2</to>
 </rule>


 <outbound-rule>
  <from>/servlet/detail\?magid=([0-9]+)&amp;categoryId=([0-9]+)</from>
  <to>/servlet/detail/$1_$2.html</to>
 </outbound-rule>
</urlrewrite>

通过上面的配置基本上实现了上面的提出的问题。

1:通过:“/servlet/detail?magid=24&categoryid=42”来访问,得在<outbound-rule>标签中配置,同时还得在<rule>中配置相关信息。如果rule中没有配置,会找不到相关的资源信息,抱404错误

2:上面的配置文件得注意的地方:在<outbound-rule>中的特殊符号“?”“&”等得转义。不然的话也会出错,不能被重写。像上面的“outbound-rule>from标签中路径中如果出现“?”问号的话,记得要转义,“\?”。

3:jsp中,上面提出的问题中,在页面如果直接写<a href="/servlet/detail?magid=24&categoryid=42"/>这样也是错误的,同样也没办法被重写。

它只能用在response.encodeURL() 或者jstl中c:url中,才会被重写。这个也是容易犯错的地方。

jsp:页面关键代码:

  <a href="<c:url value='/servlet/detail?magid=3934&categoryId=3'/>">JSTl c:URL</a><hr/>
    <a href="<%=response.encodeUrl("/servlet/detail?magid=3934&categoryId=3") %>">response EncodeURL</a>

4:如果想在<outbound-rule>中定义多个from to标签这个是不可以的,<outbound-rule>中只能定义一个from to 标签。这个是我在程序中测试得出来的结论。只能定义一对from to标签是在个人测试得出来的结论,如果您测试出来不是这样的话,请给我指正,评判。

5:通过上面的urlrewrite.xml的配置,  <a href=”servlet/detail?44_77.html">测试</a>这样子来访问也是可以被重写的。也就是相当于双向。


这样便很好的隐藏了真实地址 
这其中有点是需要注意的,引用官网中的一段话: 
Using the example above JSP's with the code 
<a href="<%= response.encodeURL("/world.jsp?country=usa&amp;city=nyc") %>">nyc</a> 
will output 
<a href="/world/usa/nyc">nyc</a> 

Or JSTL 
<a href="<c:url value="/world.jsp?country=${country}&amp;city=${city}" />">nyc</a> 
will output 
<a href="/world/usa/nyc">nyc</a>
 

需要转化的链接不能直接写在a标签中,需要写在c:url或其他服务器需要解析的变量中,这样才能对其重新显示

注意:<rule>标签可以单独的存在。而<outbound-rule>必须要和<rule>标签成对出现。而且在页面的时候需要<c:url>标签来转换成<rule>所对应的规则。

转自:http://hi.baidu.com/allen_zzw/item/e2d16a539fdf41a2acc857b2

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值