Stu*_*ent 51 navigation url jsf redirect
我正在学习JSF,当我意识到每当我们使用时<h:form>
,JSF的标准行为总是向我显示浏览器中上一页的URL ,而不是当前页面的URL,我感到非常惊讶和困惑.
我知道这与JSF总是将表单发布到同一页面的方式有关,然后只是呈现控制器将其返回给浏览器的任何页面,而浏览器不知道页面位置已更改.
似乎JSF已经存在了足够长的时间,必须有一个干净,可靠的方法来处理这个问题.如果是这样,你介意分享吗?
我找到了各种解决方法,但遗憾的是,这似乎不是一个真正可靠的解决方案.
"?faces-redirect=true"
到每个 bean的操作的返回值然后
@RequestScoped
用其他东西替换(Flash Scopes,CDI对话,@ SessionScoped,......).如果它"?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的搜索表单等.
如果请求是非幂等的,只需在同一视图中有条件地显示结果(即返回null
或void
从动作方法中使用例如<h:message(s)>
和/或rendered
).
例如,页内数据输入/编辑,多步向导,模态对话框,确认表等.
如果请求是非幂等的,但目标页面是幂等的,则只需在POST后发送重定向(即使用?faces-redirect=true
from action方法返回结果,或手动调用ExternalContext#redirect()
,或放入<redirect/>
旧的XML导航案例).
例如,显示成功编辑后的所有数据列表,登录后重定向等.
请注意,纯页面到页面导航通常是幂等的,这是许多JSF启动器失败的地方,因为滥用命令链接/按钮,然后抱怨URL不会更改.另请注意,导航案例很少用于针对SEO/UX开发的现实世界应用程序中,这是许多JSF教程失败的原因,让读者不相信.
另请注意,使用POST绝对不比GET"更安全",因为请求参数在URL中不会立即可见.它们仍然可以在HTTP请求主体中看到并且仍然可以操作.因此,为了"安全",绝对没有理由更喜欢POST for幂等请求.真正的安全性是使用HTTPS而不是HTTP并检查业务服务方法,如果允许当前登录的用户查询实体X,或操纵实体X等.一个体面的安全框架为此提供注释.
归档时间: |
|
查看次数: |
41215 次 |
最近记录: |