0

我正在尝试驯服 urlrewritefilter,看起来当一个带有重定向的规则与另一个带有 forward 的规则匹配时,我不会像预期的那样在地址栏中看到我正在重定向的 URL。

这是一个配置片段:

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

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

在我尝试访问时,我期望通过此规则完成的操作patha

  • patha将我的浏览器重定向到的规则pathb,地址栏中的 URL正在更改
  • 由于这条规则不是最后一条,所以规则 forpathb也很好匹配,所以浏览器会转发到 pathc,但是,因为这是转发,所以地址栏中的 URL仍然是 pathb

但实际上发生的事情是我转发到 pathc 而地址栏没有任何变化。

我的问题是:为什么会这样,我如何才能真正实现我所寻求的?

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

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

结果是一样的 - URL 没有被重写。

4

1 回答 1

5

您注意到的是预期的行为。有了forward您,您将永远不会在浏览器中看到 URL。forward请参阅以下和之间的区别redirect

向前

  • 转发是由 servlet 在内部执行的,浏览器完全不知道它已经发生,所以它的原始 URL
  • 保持不变 任何浏览器重新加载结果页面都会简单地重复原始请求,使用原始 URL

重定向

  • 重定向是一个两步过程,其中 Web 应用程序指示浏览器获取第二个 URL,这与原始 URL 不同。第二个 URL 的浏览器重新加载不会重复原始请求,而是会获取第二个 URL
  • 重定向比转发稍微慢一些,因为它需要两个浏览器请求,没有一个对象放置在原始请求范围内对第二个请求不可用
于 2012-09-22T13:33:40.543 回答