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

sha*_*unc 0 jsp servlets url-rewriting servlet-filters tuckey-urlrewrite-filter

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

这是一个配置片段:

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

<rule>
  <from>/pathb</from>
  <to type="forward">/pathc</to>
</rule>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

response.setStatus(302);
response.setHeader("Location", "pathb");
response.setHeader("Connection", "close");
Run Code Online (Sandbox Code Playgroud)

结果是相同的 - 不会重写URL.

Ram*_*m G 5

你注意到的是预期的行为.随着forward你永远不会看到在浏览器的URL.请参阅下面的区别forwardredirect:

向前

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

重定向

  • 重定向是一个两步过程,其中Web应用程序指示浏览器获取第二个URL,这与原始浏览器重新加载第二个URL不会重复原始请求,而是取出第二个URL
  • 重定向比转发略慢,因为它需要两个浏览器请求,而不是原始请求范围中的一个对象不可用于第二个请求