【问题标题】:Mask urls in JSPJSP 中的屏蔽 url
【发布时间】:2008-12-11 12:15:34
【问题描述】:

与这个问题有关: URL characters replacement in JSP with UrlRewrite

我想在这个 JSP Java EE Web 项目中使用屏蔽 URL。 例如,如果我有这个:

http://mysite.com/products.jsp?id=42&name=Programming_Book

我想将该 URL 转换为对用户/Google 更友好的内容,例如:

http://mysite.com/product-Programming-Book

我一直在使用 UrlRewrite、转发和 RequestDispatcher 来完成我想要的,但我有点迷失了。我可能应该对所有 http 请求都有一个过滤器,重新格式化它们,然后转发页面。

谁能指点一下?尖端?

非常感谢。

更新: Servlet 做到了。感谢 Yuval 的指导。 我一直在使用 UrlRewrite,正如您在问题的第一句话中看到的那样,我还问了一个关于此的问题。但我无法按照我想要的方式让 UrlRewrite 工作。 Servlet 完成了这项工作。

【问题讨论】:

    标签: java jsp url jakarta-ee


    【解决方案1】:

    您可以使用URLRewrite filter。这就像 mod_rewrite 对于 Apache 的 HTTP Web 服务器的作用。

    http://tuckey.org/urlrewrite/

    "重定向一个网址

    <rule>
    <from>^/some/old/page\.html$</from>
    <to type="redirect">/very/new/page.html</to>
    </rule>
    

    小/友好的网址

    <rule>
    <from>^/zebra$</from>
    <to type="redirect">/big/ugly/url/1,23,56,23132.html</to>
    </rule>
    

    "

    【讨论】:

      【解决方案2】:

      我已经有一段时间没有搞砸 JSP 了,但是如果你没记错的话,你可以将 URL 模式添加到你的 web.xml(或其中一个 XML 配置文件),并让 servlet 引擎自动将请求路由到一个有效的 URL与您选择的参数。如果您愿意,我可以查看详细信息。

      在您的情况下,将 http://mysite.com/product-Programming-Book 映射到 URL http://mysite.com/products.jsp?id=42&amp;name=Programming_Book 并且用户不再看到真实的 URL。此外,您可以在应用程序中使用这个对用户更友好的 URL,作为该页面的逻辑名称。

      尤瓦尔=8-)

      【讨论】:

      【解决方案3】:

      通常,您在应用程序前端使用 Apache。如果是这样,请考虑使用 Apache 的 mod_rewrite。 http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

      【讨论】:

      • 应用程序使用 JBoss 运行(因此 Tomcat 作为 Web 容器)。 UrlRewrite 基于 Apache mod_rewrite,但我还没有弄清楚它是否适合我正在尝试做的事情。
      • 根据经验最好不要依赖 Apache 进行 url 重写。它非常适合紧急情况。但是 URL 的更改应该被视为 url 生命周期。由于 url 是应用程序的接口,因此它们的生命周期是应用程序生命周期本身的一部分。这意味着,它们应该作为应用程序的一部分进行管理、记录和版本控制。当您开始将接口更改从您的应用程序 src 和配置之外放到 Apache 中时,您会冒着随着时间的推移累积无法追踪的更改的风险。设计或改造您的应用程序,使其能够处理 URL 更改。
      • 但是如果你走那条路,用 Apache 面对 JBoss 应该没有问题(通过 mod_jk)。
      【解决方案4】:

      一方面,我建议您在应用程序中处理此问题,而不是依赖外部重写,例如通过 Apache mod_rewrite(除非您确定这是最快的方法。)

      但首先有几件事:

      我不会转换这个:

      http://mysite.com/products.jsp?id=42&name=Programming_Book

      进入这个:

      http://mysite.com/product-Programming-Book

      看,如果我只看你的书示例,我看不出以前的 URL 有什么问题。之后,这一切都适用于亚马逊。而且没有像谷歌友好的 URL(只有用户友好的 URL)这样的东西。你必须考虑为什么要进行这种类型的重写,以及如何进行。例如,在您的重写选项中,id 在哪里?

      也就是说,你必须定义一个逻辑规则来定义

      您要展示的独特页面,以及 可以识别每个页面的唯一参数组合。

      例如,使用您的书柜。假设您可以使用以下规则识别任何书籍:

      1. 国际标准书号
      2. 按作者姓名、标题和是否 适用版本(如果版本是 缺失,假设是最新的)
      3. 如果 ISBN 包含在 Author 中 姓名、标题和/或版本,忽略 除了 ISBN。也就是说,对待它 作为前者(或更准确地说, 忽略所有其他书籍标识 存在 ISBN 时的参数。)

      使用 ?parametrized url 方案,您将有以下可能性:

      http://yoursite/products?isbn=123465
      http://yoursite/products?author=johndoe&title="the cookbook" << this assumes the latest edition, or 1 if first.
      http://yoursite/products?author=johndoe&title="the cookbook"&edition=3
      http://yoursite/products?title="the cookbook"&author=johndoe
      http://yoursite/products?edition=3&title="the cookbook"&author=johndoe
      ....
      

      以此类推,适用于所有组合。因此,在您寻找技术实现之前,您必须非常仔细地考虑您将如何做到这一点。您必须创建语法和参数层次结构(例如,作者总是在标题之前,而标题总是在版本之前)。

      因此,您将得到以下结果(使用与作者 John Doe 相同的示例,他的书在第 3 版中):

      http://yoursite/product/isbn/12345
      http://yoursite/product/author/johndoe/the%20cookbook << see the %20 for encoding spaces (not a good idea, but something to take into account)
      http://yoursite/product/author/johndoe/the%20cookbook/3
      

      任何其他组合都应该生成错误或巧妙地找出如何重写为“cannon”版本并使用适当的 URL 目标向客户端发送 HTTP 3xx。

      一旦你解决了这些细节,你可以问问自己付出的努力是否值得或必要。

      因此,如果您发现自己需要,那么最简单和最便宜的 DIY 方法是编写一个过滤器来解析 url,分解参数,为 JSP 页面创建一个?参数化的 url 字符串,获取它的 RequestDispatcher 并转发给它。

      您不想进行 URL 重写,因为这些会在您的服务器和客户端之间来回传输 HTTP 303/307。或者至少您希望将其保持在最低限度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多