gpt4 book ai didi

jsf - 如何在 JSF 中导航?如何使 URL 反射(reflect)当前页面(而不是上一页)

转载 作者:行者123 更新时间:2023-12-03 04:50:02 24 4
gpt4 key购买 nike

我目前正在学习 JSF,当我意识到每当我们使用 <h:form> 时,我感到非常惊讶和困惑。 ,JSF 的标准行为是始终向我显示浏览器中上一个页面的 URL,而不是当前页面的 URL。

我知道这与 JSF 总是将表单发布到同一页面,然后只呈现 Controller 将其返回给浏览器的任何页面的方式有关,浏览器不知道页面位置已更改。

看来 JSF 已经存在了足够长的时间,必须有一个干净、可靠的方法来处理这个问题。如果是这样,您介意分享吗?

我找到了各种解决方法,但遗憾的是没有一个看起来像真正可靠的解决方案。

  • 只需接受该网址具有误导性即可。
  • 追加"?faces-redirect=true" 每个 bean 操作的返回值,然后
    • 弄清楚如何替换@RequestScoped与其他东西(Flash Scopes、CDI 对话、@SessionScoped,...)。
    • 接受每个用户操作进行两次 HTTP 往返。
  • 使用某种方法(例如第 3 方库或自定义代码)隐藏网址中的页面名称,并始终对每个页面使用相同的通用网址。

如果"?faces-redirect=true"已经尽善尽美了,有没有办法配置整个应用程序以这种方式处理所有请求?

最佳答案

事实上,JSF 作为一个基于表单的应用程序,目标为 MVC 框架,将 POST 表单提交到与请求表单的带有 <h:form> 的页面完全相同的 URL。您可以通过查看生成的 HTML 输出的 <form action> URL 来确认。这在网络开发术语中被描述为回发。默认情况下,回发导航不会导致对新 URL 的新请求,而是加载目标页面作为响应内容。当您只想进行页面到页面导航时,这确实会令人困惑。

通常,导航/重定向的正确方法取决于业务需求和请求的 idempotence(读:“可书签性”)(注意:有关具体代码示例,请参阅下面的“另请参阅”链接)。

  • 如果请求是幂等的,只需使用 GET 表单/链接而不是 POST 表单(即使用 <a><form><h:link><h:button> 而不是 <h:form><h:commandXxx> )。
    例如,页到页导航、类似 Google 的搜索表单等。

  • 如果请求是非幂等的,则只需在同一 View 中有条件地显示结果(即从操作方法返回 nullvoid 并使用例如 <h:message(s)> 和/或 rendered )。
    例如,页内数据输入/编辑、多步骤向导、模式对话框、确认表单等。

  • 如果请求是非幂等的,但目标页面是幂等的,只需在 POST 后发送重定向(即从操作方法返回结果为 ?faces-redirect=true ,或手动调用 ExternalContext#redirect() ,或将 <redirect/> 放入旧版 XML 导航案例中).
    例如,编辑成功后显示所有数据列表、登录后重定向等。

请注意,纯粹的页面到页面导航通常是幂等的,这就是许多 JSF 初学者因滥用命令链接/按钮而失败的地方,然后提示 URL 没有改变。另请注意,在根据 SEO/UX 开发的现实应用程序中很少使用导航案例,这就是许多 JSF 教程因让读者相信其他内容而失败的地方。

另请注意,使用 POST 绝对不比 GET “更安全”,因为请求参数在 URL 中不会立即可见。它们在 HTTP 请求正文中仍然可见并且仍然可操作。所以绝对没有理由为了“安全”而选择 POST 来处理幂等请求。真正的安全性在于使用 HTTPS 而不是 HTTP,并检查业务服务方法是否允许当前登录的用户查询实体 X,或操作实体 X 等。一个不错的安全框架为此提供了注释。

另请参阅:

关于jsf - 如何在 JSF 中导航?如何使 URL 反射(reflect)当前页面(而不是上一页),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15521451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com