如何在JSF中导航?如何使URL反映当前页面(而不是前一页)

Stu*_*ent 51 navigation url jsf redirect

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

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

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

我找到了各种解决方法,但遗憾的是,这似乎不是一个真正可靠的解决方案.

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

如果它"?faces-redirect=true"是如此好,有没有办法配置整个应用程序以这种方式处理所有请求?

Bal*_*usC 77

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

通常,导航/重定向的正确方法取决于业务要求和请求的幂等性(读:"书签性")(注意:具体的代码示例,请参阅下面的"另请参见"链接).

  • 如果该请求是幂等的,只是使用GET形式/链路代替POST形式(即使用<a>,<form>,<h:link><h:button>代替<h:form><h:commandXxx>).
    例如,页面到页面导航,类似Google的搜索表单等.

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

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

请注意,纯页面到页面导航通常是幂等的,这是许多JSF启动器失败的地方,因为滥用命令链接/按钮,然后抱怨URL不会更改.另请注意,导航案例很少用于针对SEO/UX开发的现实世界应用程序中,这是许多JSF教程失败的原因,让读者不相信.

另请注意,使用POST绝对不比GET"更安全",因为请求参数在URL中不会立即可见.它们仍然可以在HTTP请求主体中看到并且仍然可以操作.因此,为了"安全",绝对没有理由更喜欢POST for幂等请求.真正的安全性是使用HTTPS而不是HTTP并检查业务服务方法,如果允许当前登录的用户查询实体X,或操纵实体X等.一个体面的安全框架为此提供注释.

也可以看看:

  • 例如http://stackoverflow.com/questions/9741778/how-and-when-to-remove-a-session-scoped-bean-in-jsf-2-0/9742891#9742891 (2认同)

归档时间:

查看次数:

41215 次

最近记录:

6 年,10 月 前