JSF 2.3基于表单的Login和ViewExpiredException



我有一个web应用程序目前部署在Wildfly 22上,使用JSF 2.3和OpenJDK 11。我目前正在将登录页面从j_security_check迁移到编程登录,以下BalusC示例:

在Java EE/JSF中使用j_security_check执行用户身份验证

我没有发布登录代码,因为它完全像BalusC帖子。

登录过程工作正常,除了登录页面上的会话超时时间。换句话说,当用户请求受保护的资源时,将显示登录页面。如果在提交登录表单之前会话过期,则抛出ViewExpiredException并向用户显示错误。

我理解这是预期的行为,但这不是最终用户想要的情况。我设法使用OmniFaces的ViewExpiredExceptionHandler来最小化这种情况。这样,当抛出ViewExpiredException时,OmniFaces处理程序将捕获它并使用查询字符串重定向到当前URL。换句话说,用户在会话过期后尝试登录,登录页面再次呈现给用户。

我设法使用#{flash['org.omnifaces.view_expired'] eq true},以便向用户显示一条不错的消息,解释超时发生。

是否有办法解决这种情况,并执行一个成功的登录,即使会话到期,使用户不必输入他的凭据两次?

谢谢你的帮助!

是否有办法解决这种情况,并在会话到期时执行成功登录,以便用户不必输入他的凭据两次?

是的,通过将<f:view>transient属性设置为true来使用无状态JSF。

<f:view transient="true">
<h:form>
...
<h:commandButton ... action="#{requestScopedBean.login}" />
</h:form>
</f:view>

请注意,支持bean必须是@RequestScoped,而不是@ViewScoped或更大。

参见:

  • 在JSF中无状态的用处是什么?
  • 在后台处理ViewExpiredException并恢复表单值
  • JSF没有@ viewscope

相关内容

  • 没有找到相关文章

最新更新