UrlRewriteFilter - 结合重定向和转发规则

时间:2012-09-12 11:45:29

标签: jsp servlets url-rewriting servlet-filters tuckey-urlrewrite-filter

我正在努力驯服urlrewritefilter,它看起来像 比如当一个带有重定向的规则与另一个带有转发的规则匹配时,我将无法按预期看到我在地址栏中重定向的URL。

以下是配置代码段:

<rule>
  <from>/patha</from>
  <to type="redirect">/pathb</to>
</rule>

<rule>
  <from>/pathb</from>
  <to type="forward">/pathc</to>
</rule>

在我尝试访问patha

时,我希望通过此规则完成的工作
  • patha将我的浏览器重定向到pathb的规则,地址栏中的网址正在更改
  • 由于此规则不是最后一条,因此pathb的规则也是一个很好的匹配,因此浏览器会转发到pathc,但是,因为这是转发,地址栏中的URL 仍为pathb

但实际上发生的事情是我在没有任何地址栏更改的情况下转发到pathc。

我的问题是:为什么会如此以及我如何才能真正实现我的目标?

UPD:    我已经通过jsp中的重定向测试了urlrewritefilter:

response.setStatus(302);
response.setHeader("Location", "pathb");
response.setHeader("Connection", "close");

结果相同 - 不会重写URL。

1 个答案:

答案 0 :(得分:5)

您注意到的是预期的行为。使用forward,您将永远不会在浏览器中看到该网址。请参阅以下forwardredirect之间的差异:

转发

  • 一个转发是由se​​rvlet在内部执行的,浏览器完全没有意识到它已经发生了,所以它的原始URL
  • 保持完整,任何浏览器重新加载生成的页面都会简单地重复原始请求,并使用原始网址

<强>重定向

  • 重定向是一个两步过程,Web应用程序指示该过程 浏览器获取第二个URL,它与原始URL不同 浏览器重新加载第二个URL不会重复原始 请求,但宁愿获取第二个网址
  • 重定向比前进略慢,因为它需要两个 浏览器请求,而不是原始请求中的一个对象 范围不适用于第二个请求